std:: lgamma, std:: lgammaf, std:: lgammal
|
定义于头文件
<cmath>
|
||
| (1) | ||
|
float
lgamma
(
float
num
)
;
double
lgamma
(
double
num
)
;
|
(C++23 前) | |
|
/*floating-point-type*/
lgamma ( /*floating-point-type*/ num ) ; |
(C++23 起)
(C++26 起为 constexpr) |
|
|
float
lgammaf
(
float
num
)
;
|
(2) |
(C++11 起)
(C++26 起为 constexpr) |
|
long
double
lgammal
(
long
double
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
运算。
|
(since C++26) |
|
A)
为所有整数类型提供了额外的重载,这些类型将被视为
double
。
|
(since C++11) |
目录 |
参数
| num | - | 浮点数或整数值 |
返回值
若无错误发生,则返回伽马函数对
num
取对数的值,即
log
e
|
∫
∞
0
t
num-1
e
-t
d
t
|
。
如果发生极点错误,则返回
+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 的阶乘的对数值。
POSIX 版本的
lgamma
不是线程安全的:每次函数执行都会将
num
的伽玛函数符号存储在静态外部变量
signgam
中。某些实现提供了
lgamma_r
,该函数将指向用户提供的
signgam
存储空间的指针作为第二个参数,因此是线程安全的。
存在一个名为
gamma
的非标准函数,但其定义并不一致。例如,glibc和4.2BSD版本的
gamma
执行的是
lgamma
,而4.4BSD版本的
gamma
执行的则是
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 const double 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 raised\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: 数值结果超出范围
FE_DIVBYZERO raised
参见
|
(C++11)
(C++11)
(C++11)
|
伽玛函数
(函数) |
|
C 文档
关于
lgamma
|
|
外部链接
| 韦斯坦, 埃里克·W.《对数伽玛函数》 来自 MathWorld —— 一个 Wolfram 网络资源。 |