| Common mathematical functions | |||||||||||||||||||||||||||||||
| Mathematical special functions(C++17) | |||||||||||||||||||||||||||||||
| Mathematical constants(C++20) | |||||||||||||||||||||||||||||||
| Basic linear algebra algorithms(C++26) | |||||||||||||||||||||||||||||||
| Data-parallel types (SIMD)(C++26) | |||||||||||||||||||||||||||||||
| Floating-point environment(C++11) | |||||||||||||||||||||||||||||||
| Complex numbers | |||||||||||||||||||||||||||||||
Numeric array (valarray) | |||||||||||||||||||||||||||||||
| Pseudo-random number generation | |||||||||||||||||||||||||||||||
| Bit manipulation(C++20) | |||||||||||||||||||||||||||||||
| Saturation arithmetic(C++26) | |||||||||||||||||||||||||||||||
| Factor operations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
| Interpolations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
| Generic numeric operations | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
| C-style checked integer arithmetic | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
| Functions | ||||||||||||||||
| Basic operations | ||||||||||||||||
| ||||||||||||||||
| Exponential functions | ||||||||||||||||
| Power functions | ||||||||||||||||
| Trigonometric and hyperbolic functions | ||||||||||||||||
| Error and gamma functions | ||||||||||||||||
| ||||||||||||||||
| Nearest integer floating point operations | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
| Floating point manipulation functions | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
| Classification and comparison | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
| Types | |||||||||||||||||||||||||||||||||||||||||
| Macro constants | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
Defined in header <cmath> | ||
| (1) | ||
float lgamma(float num); double lgamma(double num); | (until C++23) | |
/*floating-point-type*/ lgamma(/*floating-point-type*/ num); | (since C++23) (constexpr since C++26) | |
float lgammaf(float num); | (2) | (since C++11) (constexpr since C++26) |
longdouble lgammal(longdouble num); | (3) | (since C++11) (constexpr since C++26) |
SIMD overload(since C++26) | ||
Defined in header <simd> | ||
template</*math-floating-point*/ V> constexpr/*deduced-simd-t*/<V> | (S) | (since C++26) |
Additional overloads(since C++11) | ||
Defined in header <cmath> | ||
template<class Integer> double lgamma( Integer num); | (A) | (constexpr since C++26) |
std::lgamma for all cv-unqualified floating-point types as the type of the parameter.(since C++23)S) The SIMD overload performs an element-wise std::lgamma onv_num.
| (since C++26) |
A) Additional overloads are provided for all integer types, which are treated asdouble. | (since C++11) |
Contents |
| num | - | floating-point or integer value |
If no errors occur, the value of the logarithm of the gamma function ofnum, that is\(\log_{e}|{\int_0^\infty t^{num-1} e^{-t} \mathsf{d}t}|\)loge|∫∞
0tnum-1
e-t dt|, is returned.
If a pole error occurs,+HUGE_VAL,+HUGE_VALF, or+HUGE_VALL is returned.
If a range error due to overflow occurs,±HUGE_VAL,±HUGE_VALF, or±HUGE_VALL is returned.
Errors are reported as specified inmath_errhandling.
Ifnum is zero or is an integer less than zero, a pole error may occur.
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
Ifnum is a natural number,std::lgamma(num) is the logarithm of the factorial ofnum-1.
ThePOSIX version oflgamma is not thread-safe: each execution of the function stores the sign of the gamma function ofnum in the static external variablesigngam. Some implementations providelgamma_r, which takes a pointer to user-provided storage forsinggam as the second parameter, and is thread-safe.
There is a non-standard function namedgamma in various implementations, but its definition is inconsistent. For example, glibc and 4.2BSD version ofgamma executeslgamma, but 4.4BSD version ofgamma executestgamma.
The additional overloads are not required to be provided exactly as(A). They only need to be sufficient to ensure that for their argumentnum of integer type,std::lgamma(num) has the same effect asstd::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);// or std::numbers::pi since C++20 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'; // special valuesstd::cout<<"lgamma(1) = "<< std::lgamma(1)<<'\n'<<"lgamma(+Inf) = "<< std::lgamma(INFINITY)<<'\n'; // error handlingerrno=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";}
Output:
lgamma(10) = 12.8018, log(9!) = 12.8018, exp(lgamma(10)) = 362880lgamma(0.5) = 0.572365, log(sqrt(pi)) = 0.572365lgamma(1) = 0lgamma(+Inf) = inflgamma(0) = inf errno == ERANGE: Numerical result out of range FE_DIVBYZERO raised
(C++11)(C++11)(C++11) | gamma function (function)[edit] |
C documentation forlgamma | |
| Weisstein, Eric W. "Log Gamma Function." From MathWorld — A Wolfram Web Resource. |