TGAMMA(3)

名前
tgamma, tgammaf, tgammal - 本当のガンマ関数

書式
#include <math.h>

double tgamma(double x);
float tgammaf(float x);
long double tgammal(long double x);

-lm でリンクする。

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

tgamma(), tgammaf(), tgammal():
    _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
    or cc -std=c99

説明
ガンマ関数は以下のように定義される:

     Gamma(x) = t^(x-1) e^-t dt の 0 から無限大までの積分

この関数は正でない整数を除くすべての実数に対して定義されている。 非負の整数 m に関して、以下が成立する:

    Gamma(m+1) = m!

より一般的には、すべての x に関して以下が成立する:

    Gamma(x+1) = x * Gamma(x)

さらに、極を除くすべての x で次式も成立する:

    Gamma(x) * Gamma(1 - x) = PI / sin(PI * x)

返り値
成功すると、これらの関数は Gamma(x) を返す。 x が NaN の場合、NaN が返される。 x が正の無限大の場合、正の無限大が返される。 x が負の整数か負の無限大の場合、領域エラー (domain error) が発生し、 NaN が返される。 結果がオーバーフローする場合、範囲エラー (range error) が発生し、 各関数はそれぞれ HUGE_VAL, HUGE_VALF, HUGE_VALL, を返す。この際、数学的に正しい符号が付与される。 結果がアンダーフローする場合、範囲エラー (range error) が発生し、 関数は 0 をを返す。この際、数学的に正しい符号が付与される。 x が -0 か +0 の場合、極エラー (pole error) が発生し、 各関数はそれぞれ HUGE_VAL, HUGE_VALF, HUGE_VALL, を返す。 0 と同じ符号が付与される。

エラー
これらの関数を呼び出した際にエラーが発生したかの判定方法についての情報は math_error(7) を参照のこと。

以下のエラーが発生する可能性がある。

領域エラー: x が負の整数か負の無限大
    errno に EDOM が設定される。 不正 (invalid) 浮動小数点例外 (FE_INVALID) が上がる (「バグ」の節を参照)。

極エラー (pole error): x が +0 か -0
    errno に ERANGE が設定される。 0 による除算 (divide-by-zero) 浮動小数点例外 (FE_DIVBYZERO) が上がる。

範囲エラー (range error): 結果のオーバーフロー
    errno に ERANGE が設定される。 オーバーフロー浮動小数点例外 (FE_OVERFLOW) が上がる。

glibc では、C99 や POSIX.1-2001 で規定されていない以下のエラーも 起こり得る。

範囲エラー (range error): 結果のアンダーフロー
    アンダーフロー浮動小数点例外 (FE_UNDERFLOW) が上がる。

    この場合は errno は設定されない。

バージョン
これらの関数は glibc バージョン 2.1 で初めて登場した。

準拠
C99, POSIX.1-2001.

注意
この関数を「本当の (true) ガンマ関数」と呼ばなければならなかった。 なぜなら、他の値を返す gamma(3) という関数がすでに存在するからである (詳細については gamma(3) を参照)。

バグ
x が負の無限大の場合、 errno は設定されない (EDOM が設定されるべきである)。 glibc バージョン 2.3.3 以前では、 引き数に +0 や -0 を渡すと、極エラーではなく、 領域エラーを間違って発生していた (領域エラーの場合、 errno に EDOM を設定され、 FE_INVALID 例外が発生する)。

関連項目
gamma(3), lgamma(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。