Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
float       lgamma ( float num );

double      lgamma ( double num );

long double lgamma ( long 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>

            lgamma ( const V& v_num );
(S) (seit C++26)
Definiert in der Header-Datei <cmath>
template< class Integer >
double      lgamma ( Integer num );
(A) (constexpr seit C++26)
1-3) Berechnet den natürlichen Logarithmus des Absolutbetrags der Gammafunktion von num. Die Bibliothek stellt Überladungen von 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.
(Siehe math-floating-point und deduced-simd-t für ihre Definitionen.)
(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|
0
tnum-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) [bearbeiten]
C-Dokumentation für lgamma

[edit] Externe Links

Weisstein, Eric W. "Log Gamma Function." From MathWorld — A Wolfram Web Resource.