Резюме: Историческая неразбериха изобилует; избегайте gamma()
и используйте tgamma()
.
Эти функции реализует математическая библиотека, а не gcc (компилятор). Если вы видите различное поведение в MacOS и Ubuntu, возможно, это связано с тем, что Ubuntu использует glibc, а MacOS использует что-то другое.
В стандартной библиотеке ISO C нет функции с именем gamma
.
Существуют стандартные функции, называемые lgamma
и tgamma
. Цитируя N1570 (последний проект стандарт ISO C 2011 г.), разделы 17.12.8.3 и 17.12.8.4:
#include <math.h>
double lgamma(double x);
float lgammaf(float x);
long double lgammal(long double x);
Функции lgamma вычисляют натуральный логарифм абсолютного значения гаммы x. Ошибка диапазона возникает, если x слишком велико. Ошибка полюса может возникнуть, если x является отрицательным целым числом или нулем.
#include <math.h>
double tgamma(double x);
float tgammaf(float x);
long double tgammal(long double x);
Функции tgamma вычисляют гамма-функцию x. Ошибка домена или ошибка полюса может возникнуть, если x является отрицательным целым числом или нулем. Ошибка диапазона возникает, если величина x слишком велика, и может возникнуть, если величина x слишком мала.
Эти функции отсутствуют в стандарте ISO C 1990 года. Они были представлены C99.
Цитируя справочную страницу Linux для gamma
:
Эти функции устарели: вместо них используйте функции tgamma(3) или lgamma(3), в зависимости от ситуации.
Определение гамма-функции см. в разделе tgamma(3).
- #P11# <блочная цитата> #P12# блочная цитата>
- #P13# <блочная цитата> #P14# блочная цитата>
и историческая справка:
В 4.2BSD была gamma(), которая вычисляла ln(|Gamma(|x|)|), оставляя знак Gamma(|x|) во внешнем целочисленном signgam. В 4.3BSD имя было изменено на lgamma(3), а справочная страница обещает
«Когда-нибудь в будущем название «гамма» будет реабилитировано и будет использоваться для функции «Гамма».
Это действительно произошло в 4.4BSD, где gamma() вычисляет функцию Gamma (без влияния на signgam). Однако это произошло слишком поздно, и теперь у нас есть tgamma(3), функция «истинной гаммы».
Поскольку gamma
не является стандартной функцией C, компиляция с gcc -std=c99 -pedantic
или gcc -std=c11 -pedantic
должна выдавать как минимум предупреждение при любой попытке ее вызова.
Вероятно, вам следует использовать tgamma()
(или lgamma()
, если вам нужен натуральный логарифм) и избегать использования gamma()
.
Стандарт C, похоже, не говорит, что такое гамма-функция. справочная страница Linux tgamma() (но если вы пытаетесь использовать его, вы, вероятно, уже знаете, что это такое):
Гамма-функция определяется как
Gamma(x) = интеграл от 0 до бесконечности от t^(x-1) e^-t dt
Он определен для каждого действительного числа, кроме неположительных целых чисел.
Для неотрицательного интеграла m выполняется
Гамма(м+1) = м!
и, в более общем случае, для всех x:
Гамма(х+1) = х * Гамма(х)
Кроме того, следующее справедливо для всех значений x вне полюсов:
Гамма (x) * Гамма (1 - x) = PI / sin (PI * x)
person
Keith Thompson
schedule
08.08.2013