Spec-Zone.ru › C++

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

Определено в заголовке <cmath>
float       lgamma ( float num );
double      lgamma ( double num );
long double lgamma ( long double num );
(1) (до C++23)
/*floating-point-type*/
            lgamma ( /*floating-point-type*/ num );
(с C++23)
(constexpr с C++26)
float       lgammaf( float num );
(2) (с C++11)
(constexpr с C++26)
long double lgammal( long double num );
(3) (с C++11)
(constexpr с C++26)
Перегрузка 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) (constexpr с C++26)
1-3) Вычисляет натуральный логарифм абсолютного значения гамма-функции от num. Библиотека предоставляет перегрузки std::lgamma для всех типов с плавающей точкой без cv-квалификаторов в качестве типа параметра.(с C++23)
S) Перегрузка SIMD выполняет поэлементное std::lgamma над v_num. (Определения см. в разделах math-floating-point и deduced-simd-t.) (с C++26)
A) Предоставляются дополнительные перегрузки для всех целочисленных типов, которые обрабатываются как double. (с C++11)

Параметры

num - значение с плавающей точкой или целочисленное значение

Возвращаемое значение

Если ошибок не возникает, возвращается значение логарифма гамма-функции от num, то есть \(\log_{e}|{\int_0^\infty t^{num-1} e^{-t} \mathsf{d}t}|\)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, однако её определение не согласовано. Например, версия glibc и 4.2BSD функции gamma выполняет lgamma, а версия 4.4BSD функции gamma выполняет 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); // 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";
}

Вывод:

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

См. также

tgammatgammaftgammal
(C++11)(C++11)(C++11)
гамма-функция
(функция)
Документация C для lgamma

Внешние ссылки

Вайсстайн, Эрик В. «Функция логарифма гамма-функции». Из MathWorld — веб-ресурса Wolfram.

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/math/lgamma

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API