Spec-Zone.ru › C++

std::tgamma, std::tgammaf, std::tgammal

Определено в заголовке <cmath>
(1)
float       tgamma ( float num );
double      tgamma ( double num );
long double tgamma ( long double num );
(до C++23)
/* floating-point-type */
            tgamma ( /* floating-point-type */ num );
(с C++23)
(constexpr с C++26)
float       tgammaf( float num );
(2) (с C++11)
(constexpr с C++26)
long double tgammal( long double num );
(3) (с C++11)
(constexpr с C++26)
Дополнительные перегрузки (с C++11)
Определено в заголовке <cmath>
template< class Integer >
double      tgamma ( Integer num );
(A) (constexpr с C++26)
1-3) Вычисляет гамма-функцию num. Библиотека предоставляет перегрузки std::tgamma для всех типов чисел с плавающей точкой без квалификатора cv в качестве типа параметра.(с C++23)
A) Дополнительные перегрузки предоставляются для всех целочисленных типов, которые обрабатываются как double. (с C++11)

Параметры

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

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

Если ошибки не произошли, возвращается значение гамма-функции от num, то есть \(\Gamma(\mathtt{num}) = \displaystyle\int_0^\infty\!\! t^{\mathtt{num}-1} e^{-t}\, dt\)∫∞0tnum-1 e-t dt.

Если произошла ошибка области значений, возвращается определенное реализацией значение (NaN, где поддерживается).

Если произошла ошибка полюса, возвращается ±HUGE_VAL, ±HUGE_VALF, или ±HUGE_VALL.

Если произошла ошибка диапазона из-за переполнения, возвращается ±HUGE_VAL, ±HUGE_VALF, или ±HUGE_VALL.

Если произошла ошибка диапазона из-за недополнения, возвращается корректное значение (после округления).

Обработка ошибок

Ошибки сообщаются так, как указано в math_errhandling.

Если num равно нулю или является целым числом меньше нуля, может произойти ошибка полюса или ошибка области значений.

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),

  • Если аргумент равен ±0, возвращается ±∞ и поднимается FE_DIVBYZERO.
  • Если аргумент является отрицательным целым числом, возвращается NaN и поднимается FE_INVALID.
  • Если аргумент равен -∞, возвращается NaN и поднимается FE_INVALID.
  • Если аргумент равен +∞, возвращается +∞.
  • Если аргумент равен NaN, возвращается NaN.

Примечания

Если num является натуральным числом, то std::tgamma(num) является факториалом num - 1. Многие реализации вычисляют точный факториал в целочисленной области, если аргумент является достаточно малым целым числом.

Для IEEE-совместимого типа double, переполнение происходит, если 0 < num && num < 1 / DBL_MAX или если num > 171.7.

POSIX требует, чтобы ошибка полюса произошла, если аргумент равен нулю, но ошибка области значений происходит, когда аргумент является отрицательным целым числом. Также указано, что в будущем ошибки области значений могут быть заменены ошибками полюса для отрицательных целочисленных аргументов (в этом случае значение возврата в этих случаях изменится с NaN на ±∞).

В различных реализациях существует нестандартная функция, называемая gamma, но ее определение непостоянно. Например, glibc и версия gamma 4.2BSD выполняет lgamma, но версия gamma 4.4BSD выполняет tgamma.

Дополнительные перегрузки не обязаны предоставляться точно как (A). Они должны быть достаточными для того, чтобы для аргумента num целочисленного типа, std::tgamma(num) имел тот же эффект, что и std::tgamma(static_cast<double>(num)).

Пример

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
 
int main()
{
    std::cout << "tgamma(10) = " << std::tgamma(10)
              << ", 9! = " << 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 << '\n'
              << "tgamma(0.5) = " << std::tgamma(0.5)
              << ", sqrt(pi) = " << std::sqrt(std::acos(-1)) << '\n';
 
    // special values
    std::cout << "tgamma(1) = " << std::tgamma(1) << '\n'
              << "tgamma(+Inf) = " << std::tgamma(INFINITY) << '\n';
 
    // error handling
    errno = 0;
    std::feclearexcept(FE_ALL_EXCEPT);
 
    std::cout << "tgamma(-1) = " << std::tgamma(-1) << '\n';
 
    if (errno == EDOM)
        std::cout << "    errno == EDOM: " << std::strerror(errno) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID raised\n";
}

Возможный вывод:

tgamma(10) = 362880, 9! = 362880
tgamma(0.5) = 1.77245, sqrt(pi) = 1.77245
tgamma(1) = 1
tgamma(+Inf) = inf
tgamma(-1) = nan
    errno == EDOM: Numerical argument out of domain
    FE_INVALID raised

См. также

lgammalgammaflgammal
(C++11)(C++11)(C++11)
натуральный логарифм гамма-функции
(функция)
betabetafbetal
(C++17)(C++17)(C++17)
бета-функция
(функция)
C документация для tgamma

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

Weisstein, Eric W. "Гамма-функция." Из 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/tgamma

Spec-Zone.ru

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