lgamma, lgammaf, lgammal

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小运算
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)
(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)
(C99)
(C23)
(C23)
三角及双曲函数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
误差及伽马函数
(C99)
(C99)
lgamma
(C99)
(C99)
临近整数的浮点运算
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
窄化运算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量与量指数函数
十进制重编码函数
全序与载荷函数
分类
(C99)
(C99)
(C99)
(C23)
类型
宏常量
 
定义于头文件 <math.h>
float       lgammaf( float arg );
(1) (C99 起)
double      lgamma( double arg );
(2) (C99 起)
long double lgammal( long double arg );
(3) (C99 起)
定义于头文件 <tgmath.h>
#define lgamma( arg )
(4) (C99 起)
1-3) 计算 arg伽马函数绝对值的自然对数。
4) 泛型宏:若 arg 拥有 long double 类型,则调用 lgammal 。否则,若 arg 拥有整数类型或 double 类型,则调用 lgamma 。否则调用lgammaf

参数

arg - 浮点值

返回值

若不出现错误,则返回 arg 的伽马函数的自然对数,即 log
e
|
0
targ-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 为自然数,则 lgamma(arg)arg-1 阶乘的自然对数。

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

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

示例

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <errno.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("lgamma(10) = %f, log(9!)=%f\n", lgamma(10), log(2*3*4*5*6*7*8*9));
    double pi = acos(-1);
    printf("lgamma(0.5) = %f, log(sqrt(pi)) = %f\n", log(sqrt(pi)), lgamma(0.5));
    // 特殊值
    printf("lgamma(1) = %f\n", lgamma(1));
    printf("lgamma(+Inf) = %f\n", lgamma(INFINITY));
    // 错误处理
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("lgamma(0) = %f\n", lgamma(0));
    if(errno == ERANGE) perror("    errno == ERANGE");
    if(fetestexcept(FE_DIVBYZERO)) puts("    FE_DIVBYZERO raised");
}

可能的输出:

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

引用

  • C11 标准(ISO/IEC 9899:2011):
  • 7.12.8.3 The lgamma functions (p: 250)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.5.3 The lgamma functions (p: 525)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.12.8.3 The lgamma functions (p: 231)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.5.3 The lgamma functions (p: 462)

参阅

(C99)(C99)(C99)
计算伽马函数
(函数)

外部链接

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