# std::lgamma, std::lgammaf, std::lgammal

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
float lgamma ( float arg ); float lgammaf( float arg ); | (1) | (C++11 起)
double lgamma ( double arg ); | (2) | (C++11 起)
long double lgamma ( long double arg ); long double lgammal( long double arg ); | (3) | (C++11 起)
double lgamma ( IntegralType arg ); | (4) | (C++11 起)

1-3) 计算 `arg` 的 gamma 函数绝对值的自然对数。
4) 接受任何整数类型参数的重载集或函数模板。等价于 2) （将参数转型为 double ）。

### 参数

arg | - | 浮点或整数类型值

### 返回值

若不出现错误，则返回 `arg` 的 gamma 函数的自然对数，即 \(\log_{e}|{\int_0^\infty t^{arg-1} e^{-t} \mathsf{d}t}|\)log
e|∫∞
0 t arg-1
e-t dt| 。

若出现极点错误，则返回 `+HUGE_VAL` 、 `+HUGE_VALF` 或 `+HUGE_VALL` 。

若出现上溢所致的值域错误，则返回 `±HUGE_VAL` 、 `±HUGE_VALF` 或 `±HUGE_VALL` 。

### 错误处理

报告 math_errhandling 中指定的错误。

若 `arg` 为零或为小于零的整数，则可能出现极点错误。

若实现支持 IEEE 浮点算术（ IEC 60559 ），则

- 若参数为 1 ，则返回 +0 。
- 若参数为 2 ，则返回 +0 。
- 若参数为 ±0 ，则返回 +∞ 并引发 FE_DIVBYZERO 。
- 若参数为负整数，则返回 +∞ 并引发 FE_DIVBYZERO 。
- 若参数为 ±∞ ，则返回 +∞ 。
- 若参数为 NaN ，则返回 NaN 。

### 注意

若 `arg` 为自然数，则 std::lgamma(arg) 是 `arg-1` 阶乘的自然对数。

lgamma 的 POSIX 版本不是线程安全的：每次执行函数都会存储 `arg` 的伽马函数的符号于静态外部变量 `signgam` 。一些实现提供 `lgamma_r` ，它接收指向 singgam 的用户提供存储的指针为第二参数，而且是线程安全的。

多数实现中有名为 `gamma` 的非标准函数，但其定义不一致。例如， `gamma` 的 glibc 和 4.2BSD 版本执行 `lgamma` ，但 `gamma` 的 4.4BSD 版本执行 `tgamma` 。

### 示例

    #include <iostream>
    #include <cmath>
    #include <cerrno>
    #include <cstring>
    #include <cfenv>
    #pragma STDC FENV_ACCESS ON
    const double pi = std::acos(-1);
    int main()
    {
        std::cout << "lgamma(10) = " << std::lgamma(10)
                  << ",  log(9!) = " << std::log(2*3*4*5*6*7*8*9) << '\n'
                  << "lgamma(0.5) = " << std::lgamma(0.5)
                  << " , log(sqrt(pi)) = " << std::log(std::sqrt(pi)) << '\n';
        // 特殊值
        std::cout << "lgamma(1) = " << std::lgamma(1) << '\n'
                  << "lgamma(+Inf) = " << std::lgamma(INFINITY) << '\n';
        // 错误处理
        errno = 0;
        std::feclearexcept(FE_ALL_EXCEPT);
        std::cout << "lgamma(0) = " << std::lgamma(0) << '\n';
        if (errno == ERANGE)
            std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
        if (std::fetestexcept(FE_DIVBYZERO))
            std::cout << "    FE_DIVBYZERO raised\n";
    }

输出：

    lgamma(10) = 12.8018,  log(9!) = 12.8018
    lgamma(0.5) = 0.572365 , log(sqrt(pi)) = 0.572365
    lgamma(1) = 0
    lgamma(+Inf) = inf
    lgamma(0) = inf
        errno == ERANGE: Numerical result out of range
        FE_DIVBYZERO raised

### 参阅

tgamma tgammaf tgammal (C++11)(C++11)(C++11) | gamma 函数 (函数)

### 外部链接

Weisstein, Eric W. “对数伽马函数”来自 MathWorld--A Wolfram Web Resource 。