总结:历史上的混乱比比皆是;避免gamma()
并使用tgamma()
.
实现这些函数的是数学库,而不是 gcc(编译器)。如果您在 MacOS 和 Ubuntu 上看到不同的行为,可能是因为 Ubuntu 使用 glibc 而 MacOS 使用其他东西。
没有名为的函数gamma
在 ISO C 标准库中。
有一些标准函数称为lgamma
and tgamma
。引用N1570 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf(2011年ISO C标准最新草案)第17.12.8.3和17.12.8.4节:
#include <math.h>
double lgamma(double x);
float lgammaf(float x);
long double lgammal(long double x);
The lgamma函数计算绝对值的自然对数
的伽马值x。如果出现以下情况,则会发生范围错误x太大了。一根杆子
如果出现以下情况,可能会发生错误x是负整数或零。
#include <math.h>
double tgamma(double x);
float tgammaf(float x);
long double tgammal(long double x);
The tgamma函数计算伽马函数x。域错误
否则可能会发生极错误,如果x是负整数或零。范围
如果大小发生错误x太大并且可能发生,如果
的大小x太小。
这些函数没有出现在 1990 年的 ISO C 标准中。它们是由 C99 引入的。
引用Linux 手册页gamma http://man7.org/linux/man-pages/man3/gamma.3.html:
这些函数已被弃用:相反,使用tgamma(3) 或
这lgamma(3) 适当的职能。
关于Gamma函数的定义,请参见tgamma(3).
-
*BSD版本
4.4BSD 和某些版本的 FreeBSD 中的 libm 有一个gamma正如人们所期望的那样,() 函数计算 Gamma 函数。
-
glibc版本
Glibc 有一个gamma() 函数相当于lgamma(3) 并计算Gamma函数的自然对数。
以及历史记录:
4.2BSD 有一个gamma() 计算 ln(|Gamma(|x|)|),留下符号
外部整数signgam 中的Gamma(|x|)。在 4.3BSD 中的名称
被改为lgamma(3),并且手册页承诺
“在未来的某个时候,伽玛这个名字将会被恢复,
用于伽玛函数"
这确实发生在 4.4BSD 中,其中gamma() 计算 Gamma
功能(对signgam没有影响)。然而这一切来得太晚了,
现在我们有tgamma(3)、“真伽玛”功能。
Since gamma
不是标准 C 函数,编译时使用gcc -std=c99 -pedantic
or gcc -std=c11 -pedantic
应该至少对任何调用它的尝试产生警告。
你可能应该使用tgamma()
(or lgamma()
如果你想要自然对数)并避免使用gamma()
.
C标准似乎没有说明Gamma函数是什么。这Linux tgamma() 手册页 http://man7.org/linux/man-pages/man3/tgamma.3.html确实(但如果您尝试使用它,您可能已经知道它是什么):
伽马函数定义为
Gamma(x) = t^(x-1) e^-t dt 从 0 到无穷大的积分
它是为除非正整数之外的每个实数定义的。
对于非负积分 m 有
伽马(m+1) = m!
更一般地,对于所有 x:
伽玛(x+1) = x * 伽玛(x)
此外,以下对于 x 之外的所有值都有效
极点:
伽玛(x) * 伽玛(1 - x) = PI / sin(PI * x)