Java 如何使我的阶乘方法使用小数?(伽马)

Java 如何使我的阶乘方法使用小数?(伽马),java,math,Java,Math,我有一个方法返回输入的阶乘。它适用于整数,但我不知道如何使它适用于十进制数 以下是我目前的方法: public static double factorial(double d) { if (d == 0.0) { return 1.0; } double abs = Math.abs(d); double decimal = abs - Math.floor(abs); double result = 1.0; for

我有一个方法返回输入的阶乘。它适用于整数,但我不知道如何使它适用于十进制数

以下是我目前的方法:

public static double factorial(double d)
{
    if (d == 0.0)
    {
        return 1.0;
    }

    double abs = Math.abs(d);
    double decimal = abs - Math.floor(abs);
    double result = 1.0;

    for (double i = Math.floor(abs); i > decimal; --i)
    {
        result *= (i + decimal);
    }
    if (d < 0.0)
    {
        result = -result;
    }

    return result;
}
公共静态双阶乘(双d)
{
如果(d==0.0)
{
返回1.0;
}
双abs=数学abs(d);
双十进制=绝对值-数学楼层(绝对值);
双结果=1.0;
for(双i=数学地板(abs);i>十进制;--i)
{
结果*=(i+小数);
}
如果(d<0.0)
{
结果=-结果;
}
返回结果;
}
我找到了一个实现,但没有显示代码(我丢失了链接),给出的示例是
5.5!=5.5 * 4.5 * 3.5 * 2.5 * 1.5*0.5! = 287.885278

因此,根据这个模式,我只是将十进制值添加到for循环的
result*=(I+decimal)

但很明显,我的逻辑是有缺陷的


编辑:刚刚重新设定最后一个值为0.5!,不是0.5。这一切都不同。所以
0.5!=0.88622和
5.5
=
5.5*4.5*3.5*2.5*1.5*0.88622
等于
287.883028125
阶乘实际上不是为x€R定义的,只是为x€N定义的。换句话说:你不能计算十进制的阶乘。(您可以选择5.0版,但不能选择5.1版)

编辑:这是“传统”阶乘的视图,对于(实际上很少需要的)十进制阶乘,请参阅“gamma函数”。将阶乘推广到实数的方法很难直接实现。使用一个库,例如为您计算它,或了解所涉及的内容。一旦可用,请按如下方式使用:

public static double generalizedFactorial(double d) {
    // Gamma(n) = (n-1)! for integer n
    return Gamma.gamma(d+1);
}
产出:

4.0! = 24.0
5.5! = 287.88527781504433
6.0! = 720.0
4.0! = 24.0
5.5! = 487.265625
6.0! = 720.0
前面的答案(为大于1的实数提供了类似于阶乘的解释;但由于阶乘扩展到实数时已经存在聚合,请忽略这一点):

产出:

4.0! = 24.0
5.5! = 287.88527781504433
6.0! = 720.0
4.0! = 24.0
5.5! = 487.265625
6.0! = 720.0

那么,您的实现提供了什么,您做了什么来诊断发生了什么?对于“阶乘的浮点版本”,Gamma函数可能意味着什么。完全不同的方法。看,代码中的逻辑不是有缺陷的。有缺陷的是你的假设,阶乘方法应该是有意义的小数。但这种方法被定义为适用于整个正数;没有别的。根据这种解释,
5.001!=5.001*4.001*3.001*2.001*1.001*0.001=0.1202;预期
5.001!>5!嗯。。。好吧,这是有道理的。我想逻辑是完全错误的,所以根本不可能?当你输入3.2时,谷歌计算器怎么会给出一个结果呢!例如当然,如果这是不可能的,结果将是“错误”-编辑:好的,我以前没有听说过伽马函数。。。我猜这就是google calculator使用的。你可以把它看作两个不同的“阶乘”,1是传统的函数,通常是需要的(例如组合数学),而不是为小数定义的。如果你真的想做的话,你需要的东西叫做“伽马函数”。这是先进的东西。你确定你需要吗?阶乘是为双精度定义的;该实现与朴素的整数实现无关。您需要查看gamma函数:gamma(n)=(n-1)!看,嗯。。。有意思,你能解释一下这背后的数学吗?此外,谷歌计算器输出不同的小数值。例如,3.5!在google calculator中是11.6317283966,您的代码输出19.6875。这并没有实现gamma函数(其中
G(n)=(n-1)!
表示整数
n
)-相反,要得到
f(n)=n是一个难题
用于整数,而
f(r1)
用于
1
。如果您需要google完整性的实际gamma函数,请使用库-例如。