std::lgamma, std::lgammaf, std::lgammal
| Definiert in der Header-Datei <cmath> |
||
| (1) | ||
float lgamma ( float num ); double lgamma ( double num ); |
(bis C++23) | |
| /* Gleitkommazahl-Typ */ lgamma ( /*Gleitkommazahltyp*/ num ); |
(seit C++23) (constexpr seit C++26) |
|
float lgammaf( float num ); |
(2) | (seit C++11) (constexpr seit C++26) |
long double lgammal( long double num ); |
(3) | (seit C++11) (constexpr seit C++26) |
| SIMD-Überladung (seit C++26) |
||
| Definiert im Header <simd> |
||
| template< /*math-floating-point*/ V > constexpr /*deduzierter-simd-t*/<V> |
(S) | (seit C++26) |
| Zusätzliche Überladungen (seit C++11) |
||
| Definiert in der Header-Datei <cmath> |
||
template< class Integer > double lgamma ( Integer num ); |
(A) | (constexpr seit C++26) |
std::lgamma für alle cv-unqualifizierten Gleitkommatypen als Parametertyp bereit.(seit C++23)|
S) Die SIMD-Überladung führt eine elementweise
std::lgamma auf v_num aus.
|
(seit C++26) |
|
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.
|
(seit C++11) |
Inhalt |
[edit] Parameter
| num | - | Gleitkomma- oder Ganzzahlwert |
[edit] Rückgabewert
Wenn keine Fehler auftreten, wird der Wert des Logarithmus der Gammafunktion von num, d.h. loge|∫∞
0tnum-1
e-t dt|, zurückgegeben.
Wenn ein Polfehler auftritt, wird +HUGE_VAL, +HUGE_VALF oder +HUGE_VALL zurückgegeben.
Wenn ein Bereichsfehler aufgrund von Überlauf auftritt, wird ±HUGE_VAL, ±HUGE_VALF oder ±HUGE_VALL zurückgegeben.
[edit] Fehlerbehandlung
Fehler werden wie in math_errhandling beschrieben gemeldet.
Wenn num Null ist oder eine ganze Zahl kleiner als Null ist, kann ein Polfehler auftreten.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn das Argument 1 ist, wird +0 zurückgegeben.
- Wenn das Argument 2 ist, wird +0 zurückgegeben.
- Wenn das Argument ±0 ist, wird +∞ zurückgegeben und FE_DIVBYZERO wird ausgelöst.
- Wenn das Argument eine negative ganze Zahl ist, wird +∞ zurückgegeben und FE_DIVBYZERO wird ausgelöst.
- Wenn das Argument ±∞ ist, wird +∞ zurückgegeben.
- Wenn das Argument NaN ist, wird NaN zurückgegeben.
[edit] Hinweise
Wenn num eine natürliche Zahl ist, ist std::lgamma(num) der Logarithmus der Fakultät von num - 1.
Die POSIX-Version von lgamma ist nicht threadsicher: Jede Ausführung der Funktion speichert das Vorzeichen der Gammafunktion von num in der statischen externen Variablen signgam. Einige Implementierungen stellen lgamma_r zur Verfügung, das einen Zeiger auf einen vom Benutzer bereitgestellten Speicher für singgam als zweiten Parameter nimmt und threadsicher ist.
Es gibt eine nicht standardmäßige Funktion namens gamma in verschiedenen Implementierungen, aber ihre Definition ist inkonsistent. Zum Beispiel führen die glibc und die 4.2BSD-Version von gamma lgamma aus, aber die 4.4BSD-Version von gamma führt tgamma aus.
Die zusätzlichen Überladungen müssen nicht exakt wie (A) bereitgestellt werden. Sie müssen nur ausreichend sein, um sicherzustellen, dass für ihr Argument num vom ganzzahligen Typ, std::lgamma(num) die gleiche Wirkung hat wie std::lgamma(static_cast<double>(num)).
[edit] Beispiel
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON const double 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 values std::cout << "lgamma(1) = " << std::lgamma(1) << '\n' << "lgamma(+Inf) = " << std::lgamma(INFINITY) << '\n'; // error handling 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"; }
Ausgabe
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 raised[edit] Siehe auch
| (C++11)(C++11)(C++11) |
Gammafunktion (Funktion) |
| C-Dokumentation für lgamma
| |
[edit] Externe Links
| Weisstein, Eric W. "Log Gamma Function." From MathWorld — A Wolfram Web Resource. |