Spec-Zone.ru › C++

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

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

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

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

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

Spec-Zone.ru

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