std::lgamma, std::lgammaf, std::lgammal

出自cppreference.com
 
 
 
常用數學函數
函數
基礎運算
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指數函數
(C++11)
(C++11)

(C++11)
(C++11)
冪函數
(C++11)
(C++11)
三角雙曲函數
(C++11)
(C++11)
(C++11)

誤差與伽馬函數
(C++11)
(C++11)
(C++11)
(C++11)
浮點數的最接近整數
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮點數操作函數
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分類與比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
類型
(C++11)
(C++11)
(C++11)
宏常量
分類
(C++11)(C++11)(C++11)(C++11)(C++11)


 
在標頭 <cmath> 定義
float       lgamma ( float num );
double      lgamma ( double num );
long double lgamma ( long double num );
(1) (C++23 前)
/* 浮点数类型 */
            lgamma ( /* 浮点数类型 */ 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> 
            lgamma ( const V& v_num );
(S) (C++26 起)
額外重載 (C++11 起)
在標頭 <cmath> 定義
template< class Integer >
double      lgamma ( Integer num );
(A) (C++26 起為 constexpr)
1-3) 計算 num伽馬函數絕對值的自然對數。標準庫提供所有以無 cv 限定的浮點數類型作為形參的類型的 std::lgamma 重載。(C++23 起)
S) SIMD 重載對 v_num 實施逐元素 std::lgamma
(參見 math-floating-pointdeduced-simd-t 的定義。)
(C++26 起)
A) 為所有整數類型提供額外重載,將它們當做 double
(C++11 起)

參數

num - 浮點數或整數

返回值

如果沒有發生錯誤,那麼返回 num 的伽馬函數的自然對數,即 loge|
0
tnum-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。