std::lgamma, std::lgammaf, std::lgammal
来自cppreference.com
在标头 <cmath> 定义 | ||
(1) | ||
float lgamma (float num ); double lgamma (double num ); | (C++23 前) | |
/* 浮点数类型 */ lgamma (/* 浮点数类型 */ num ); | (C++23 起) (C++26 起 constexpr) | |
float lgammaf(float num ); | (2) | (C++11 起) (C++26 起为 constexpr) |
longdouble lgammal(longdouble num ); | (3) | (C++11 起) (C++26 起为 constexpr) |
SIMD 重载(C++26 起) | ||
在标头 <simd> 定义 | ||
template</*math-floating-point*/ V > constexpr/*deduced-simd-t*/<V> | (S) | (C++26 起) |
额外重载(C++11 起) | ||
在标头 <cmath> 定义 | ||
template<class Integer > double lgamma ( Integer num ); | (A) | (C++26 起为 constexpr) |
S) SIMD 重载对 v_num 实施逐元素 std::lgamma 。
| (C++26 起) |
A) 为所有整数类型提供额外重载,将它们当做 double。 | (C++11 起) |
目录 |
[编辑]参数
num | - | 浮点数或整数 |
[编辑]返回值
如果没有发生错误,那么返回 num 的伽马函数的自然对数,即 loge|∫∞
0tnum-1
e-t dt|。
如果发生极点错误,那么返回 +HUGE_VAL、+HUGE_VALF
或 +HUGE_VALL
。
如果发生上溢导致的值域错误,那么返回 ±HUGE_VAL、±HUGE_VALF
或 ±HUGE_VALL
。
[编辑]错误处理
报告 math_errhandling 中指定的错误。
如果 num 为零或为小于零的整数,那么可能发生极点错误。
如果实现支持 IEEE 浮点数算术(IEC 60559),那么
- 如果实参是 1,那么返回 +0。
- 如果实参是 2,那么返回 +0。
- 如果实参是 ±0,那么返回 +∞ 并引发 FE_DIVBYZERO。
- 如果实参是负整数,那么返回 +∞ 并引发 FE_DIVBYZERO。
- 如果实参是 ±∞,那么则返回 +∞。
- 如果实参是 NaN,那么返回 NaN。
[编辑]注解
如果 num 是自然数,那么 std::lgamma(num) 是 num -1 阶乘的自然对数。
lgamma
的 POSIX 版本不是线程安全的:每次执行函数都会存储 num 的伽马函数的符号于静态外部变量 signgam
。一些实现提供 lgamma_r
,它接收指向 singgam 的用户提供存储的指针为第二参数,而且是线程安全的。
许多实现中都有名为 gamma
的非标准函数,但它们的定义不一致。例如,gamma
的 glibc 和 4.2BSD 版本执行 lgamma
,但 gamma
的 4.4BSD 版本执行 tgamma
。
额外重载不需要以 (A) 的形式提供。它们只需要能够对它们的整数类型实参 num 确保 std::lgamma(num) 和 std::lgamma(static_cast<double>(num)) 的效果相同。
[编辑]示例
运行此代码
#include <cerrno>#include <cfenv>#include <cmath>#include <cstring>#include <iostream> // #pragma STDC FENV_ACCESS ON constdouble pi =std::acos(-1);// C++20 起也可以使用 std::numbers::pi int main(){std::cout<<"lgamma(10) = "<< std::lgamma(10)<<",log(9!) = "<<std::log(std::tgamma(10))<<",exp(lgamma(10)) = "<<std::exp(std::lgamma(10))<<'\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\n";}
输出:
lgamma(10) = 12.8018,log(9!) = 12.8018,exp(lgamma(10)) = 362880 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
[编辑]参阅
(C++11)(C++11)(C++11) | gamma 函数 (函数) |
lgamma 的 C 文档 |
[编辑]外部链接
Weisstein, Eric W. “对数伽马函数”来自 MathWorld--A Wolfram Web Resource。 |