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