tgamma, tgammaf, tgammal

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
remainder(C99)
remquo(C99)
fma(C99)
fmax(C99)
fmin(C99)
fdim(C99)
nan
nanf
nanl
(C99)
(C99)
(C99)
指数函数
exp
exp2(C99)
expm1(C99)
log
log10
log1p(C99)
log2(C99)
幂函数
sqrt
cbrt(C99)
hypot(C99)
pow
三角及双曲函数
sinh
cosh
tanh
asinh(C99)
acosh(C99)
atanh(C99)
误差及伽马函数
erf(C99)
erfc(C99)
lgamma(C99)
tgamma(C99)
临近整数的浮点运算
ceil
floor
round
lround
llround
(C99)
(C99)
(C99)
trunc(C99)
nearbyint(C99)
rint
lrint
llrint
(C99)
(C99)
(C99)
浮点数操作函数
ldexp
scalbn
scalbln
(C99)
(C99)
ilogb(C99)
logb(C99)
分类
fpclassify(C99)
isfinite(C99)
isinf(C99)
isnan(C99)
isnormal(C99)
signbit(C99)
宏常量
 
定义于头文件 <math.h>
float       tgammaf( float arg );
(1) (C99起)
double      tgamma( double arg );
(2) (C99起)
long double tgammal( long double arg );
(3) (C99起)
定义于头文件 <tgmath.h>
#define tgamma( arg )
(4) (C99起)
1-3) 计算arg伽马函数
4) 通用类型宏:若arg类型为long double,则调用tgammal。否则,若arg类型为整数或double,则调用tgamma。否则调用tgammaf

目录

[编辑] 参数

arg - 浮点值

[编辑] 返回值

若无错误发生,则值是arg的伽马函数,即返回
0
targ-1
e-t dt

若发生定义域错误,则返回一个实现定义的值(若支持NaN则返回NaN)。

若发生极点错误,则返回±HUGE_VAL±HUGE_VALF±HUGE_VALL

若因上溢出发生值域错误,则返回±HUGE_VAL±HUGE_VALF±HUGE_VALL

若因下溢出发生值域错误,则返回舍入后的正确值。

[编辑] 错误管理

错误会按照math_errhandling所指定的方式报告。

arg是零或负整数,则可能发生极点错误或定义域错误。

若实现支持IEEE浮点运算(IEC 60559),

  • 若参数为±0,则返回±∞并引发FE_DIVBYZERO
  • 若参数为负整数,则返回NaN并引发FE_INVALID
  • 若参数为-∞,则返回NaN并引发FE_INVALID
  • 若参数为+∞,则返回+∞
  • 若参数为NaN,则返回NaN

[编辑] 注意

arg为自然数,则tgamma(arg)arg-1的阶乘。许多实现会在参数为充分小的整数情况下,计算准确的整数域阶乘。

对于IEEE兼容的类型double,溢出会在0 < x < 1/DBL_MAXx > 171.7的情况下发生。

POSIX 要求参数为零时发生极点错误,但在参数为负整数时发生定义域错误。这也限定了,在将来对于负整数参数,定义域错误可能会被极点错误取代(这时这些情况中的返回值将由NaN改为±∞)。

在多数实现中,有一个名为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("tgamma(10) = %f, 9!=%f\n", tgamma(10), 2*3*4*5*6*7*8*9.0);
    printf("tgamma(0.5) = %f, sqrt(pi) = %f\n", sqrt(acos(-1)), tgamma(0.5));
    // special values
    printf("tgamma(+Inf) = %f\n", tgamma(INFINITY));
    //error handling
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("tgamma(-1) = %f\n", tgamma(-1));
    if(errno == ERANGE) perror("    errno == ERANGE");
    else if(errno == EDOM)   perror("    errno == EDOM");
    if(fetestexcept(FE_DIVBYZERO)) puts("    FE_DIVBYZERO raised");
    else if(fetestexcept(FE_INVALID)) puts("    FE_INVALID raised");
}

可能的输出:

tgamma(10) = 362880.000000, 9!=362880.000000
tgamma(0.5) = 1.772454, sqrt(pi) = 1.772454
tgamma(+Inf) = inf
tgamma(-1) = nan
    errno == EDOM: Numerical argument out of domain
    FE_INVALID raised

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.8.4 The tgamma functions (p: 250)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.5.4 The tgamma functions (p: 525)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.8.4 The tgamma functions (p: 231)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.5.4 The tgamma functions (p: 462)

[编辑] 参阅

(C99)
(C99)
(C99)
计算伽马函数的自然对数(底为e
(函数) [edit]
tgammaC++文档

[编辑] 外部链接

Weisstein, Eric W. "Gamma Function." From MathWorld--A Wolfram Web Resource.