std::lgamma, std::lgammaf, std::lgammal
出自cppreference.com
| 在標頭 <cmath> 定義
|
||
| (1) | (C++23 前) | |
| (C++23 起) (C++26 起 constexpr) |
||
| (2) | (C++11 起) (C++26 起為 constexpr) |
|
| (3) | (C++11 起) (C++26 起為 constexpr) |
|
| SIMD 重載 (C++26 起) |
||
| 在標頭 <simd> 定義
|
||
| |
(S) | (C++26 起) |
| 額外重載 (C++11 起) |
||
| 在標頭 <cmath> 定義
|
||
| (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
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\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。 |