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

什么时候

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

这是我目前的方法:

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

因此,从这个模式中,我只是将十进制值添加到ifor循环中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

图库西

伽玛功能(推广了阶乘实数)是相当棘手的直接实现。使用诸如apache-commons-math之类的库来为您计算,或者查看其来源以了解所涉及的内容。一旦可用,请按以下方式使用:

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

以前的答案提供了一个阶乘般的解释为实数> 1,但因为已经有一个aggreed-后的阶乘实数延长,请忽略这对于任何实际的):

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章