Spec-Zone.ru › C++

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

Определено в заголовке <cmath>
(1)
float       lgamma ( float num );
double      lgamma ( double num );
long double lgamma ( long double num );
(до 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)
Дополнительные перегрузки (с C++11)
Определено в заголовке <cmath>
template< class Integer >
double      lgamma ( Integer num );
(A) (constexpr с C++26)
1-3) Вычисляет натуральный логарифм абсолютного значения гамма-функции num. Библиотека предоставляет перегрузки std::lgamma для всех типов с плавающей точкой без квалификаторов CV в качестве типа параметра.(с C++23)
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 и версия gamma из 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); // 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

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

Weisstein, Эрик В. "Логарифмическая гамма-функция". Из MathWorld — Wolfram Web Resource.

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

Spec-Zone.ru

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