有一个非常简洁的算法来计算较低的不完全伽玛函数:
https://people.sc.fsu.edu/~jburkardt/f_src/asa147/asa147.html
我们用C ++编写了这个代码。在这个算法中有一点我不明白。在一个地方计算以下表达式:
它被替换为:
显然这是一样的,但为什么这样做呢?计算lgamma的exp是否比计算tgamma函数更有效(lgamma
和tgamma
都可以在C ++中使用)?
你会在这里找到适合c ++的Gamma实现:http://www.boost.org/doc/libs/1_64_0/libs/math/doc/html/math_toolkit/sf_gamma
lgamma的计算exp是否比计算tgamma函数更有效(lgamma和tgamma在C ++中都可用)?
计算lgamma更有效,因为它基本上是n * log(n)行为。所以通常你有一个很好的近似id,你试图计算lgamma(x)/ x函数。
另外,请记住,lgamma
经常被使用,因为它是表达式的一部分,可以计算,而tgamma
,其增长速度与阶乘一样快,不是。因此,将整个表达式f(x)
计算为exp(log(f(x)))是安全的,并且如果f(x)具有tgamma
的乘积,那么log(f(x))将必须求和/减去lgamma
。
基本上避免溢出的好方法