如何创建一个函数来计算带小数的数字的阶乘?

Mic*_*ch' 9 javascript math factorial gamma-function

如何在JavaScript 中创建计算十进制数的阶乘(或伽玛函数)的函数?例如,我该如何计算2.33!

ape*_*apa 10

我可能已经找到了一个现有的解决方案......这是Lanczos方法的一个实现,我在瑞典维基百科(http://sv.wikipedia.org/wiki/Gammafunktionen)上找到了它.它是用python编写的,并且说正确最多15位小数.我将它移植到js,交叉检查一些随机值(http://www.efunda.com/math/gamma/findgamma.cfm).

http://jsfiddle.net/Fzy9C/

var g = 7;
var C = [0.99999999999980993, 676.5203681218851, -1259.1392167224028,771.32342877765313, -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7];

function gamma(z) {

    if (z < 0.5) return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z));
    else {
        z -= 1;

        var x = C[0];
        for (var i = 1; i < g + 2; i++)
        x += C[i] / (z + i);

        var t = z + g + 0.5;
        return Math.sqrt(2 * Math.PI) * Math.pow(t, (z + 0.5)) * Math.exp(-t) * x;
    }
}
Run Code Online (Sandbox Code Playgroud)

(并且当然它不支持虚数,因为js不支持)


Pet*_*son 5

作为此处其他答案的替代方案,这里有一个更简单的伽马函数近似值,由 Gerg 于 2007 年提出?内梅斯。(请参阅有关斯特林近似的维基百科页面)。

在此处输入图片说明

这可以直接在 JavaScript 中的一行中实现:

function gamma(z) {
  return Math.sqrt(2 * Math.PI / z) * Math.pow((1 / Math.E) * (z + 1 / (12 * z - 1 / (10 * z))), z);
}
Run Code Online (Sandbox Code Playgroud)

您可以在 jsFiddle 上看到这一点。

对于 z > 8,这精确到 8 位数字,但对于较小的 z它仍然精确到少数几位数字。它不如 Lanczos 近似准确,但它更简单,速度稍快一些

请注意,伽马函数和阶乘函数略有不同。阶乘函数可以根据伽马函数定义,因此:

function factorial(n) {
  return gamma(n + 1);
}
Run Code Online (Sandbox Code Playgroud)