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

时间:2015-07-21 12:53:44

标签: 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 (double i = Math.floor(abs); i > decimal; --i)
    {
        result *= (i + decimal);
    }
    if (d < 0.0)
    {
        result = -result;
    }

    return result;
}

我找到了一个实现但代码没有显示(我丢失了链接),给出的示例是5.5! = 5.5 * 4.5 * 3.5 * 2.5 * 1.5*0.5! = 287.885278

所以从这种模式来看,我只是在for-loop i

中将小数值添加到result *= (i + decimal)

但显然我的逻辑是有缺陷的

编辑:刚刚意识到最后一个值是0.5!而不是0.5。这一切都有所不同。所以0.5! = 0.886225.5! = 5.5 * 4.5 * 3.5 * 2.5 * 1.5 * 0.88622等于287.883028125

2 个答案:

答案 0 :(得分:5)

gamma function(将阶乘推广到实数)直接实现相当棘手。使用apache-commons-math等库为您计算,或look at their source了解所涉及的内容。一旦可用,请使用如下:

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

以前的回答为实数提供类似于因子的解释&gt; 1;但由于已经存在对于实数的阶乘扩展,请忽略这适用于任何实用的):

public static double f(double d) {
    double r = d - Math.floor(d) + 1;
    for (;d>1; d-=1) {
        r *= d;
    }
    return r;
}

输出:

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

答案 1 :(得分:4)

Factorial实际上并未定义为x€R,仅适用于x€N。用文字:你不能计算小数的阶乘。 (你可以5.0,但不能5.1)

编辑:那就是#34;传统&#34; factorial,for(真的很少需要)十进制阶乘,参见&#34; gamma函数&#34;。