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) |
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
См. также
|
(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