在正整数输入处产生正确答案的伽玛函数的 C# 实现?

计算科学 数字
2021-12-16 06:39:41

我需要伽马函数的 C# 实现,它可以在正整数输入处产生正确的准确答案。我看了一下 MathNet.Numerics Meta.Numerics。在这两种情况下,如果你计算像 gamma(5)-4! 这样的东西,通过整数算术评估后者,你会得到一个绝对值大约为 10^-14 的答案,而不是预期的零。

我可以将整数编码为特例。但这会导致一些奇怪的行为;例如,对于 x>=2,我的 gamma 函数可能不会单调递增。

有人知道可以使用的库吗?

2个回答

Gamma 函数的GSL 实现为双精度(大于溢出的整数)存储了高达 297 的整数阶乘情况,并将这些值的表直接用于整数参数(参见第 42-555 行左右)。您在这些值中看到的任何错误都应该是由于将整数转换为双精度而导致精度损失,或者由于值太大,您无法将确切的整数存储在双精度中并丢失最低有效数字。估计的绝对误差是机器 epsilon 乘以函数值,或大约是 ulp,这与您所能得到的差不多。为了Γ(5)=4!,这也将在附近1014,在最坏的情况下(我得到24×2.22×1016=5.328×1015,四舍五入为1014); 这是使用双精度的代价。如果您需要整数参数的准确答案,并且只有 0 到 18 之间的整数参数,请考虑使用返回长整数的阶乘函数。

以下代码将为您提供预期的零

static void Main(string[] args)
{
    int a = 24;
    double result = alglib.gammafunction(5) - a;
    Console.WriteLine(result);
}

这里使用的库是alglib