LGAMMA(3M) — UNIX Programmer’s Manual
名称
lgamma − 対数ガンマ関数
形式
#include <math.h>
double lgamma(x)
double x;
解説
ここで、G(x) は、
= ∫0s10∞ tx−1 e−t dt for x > 0 and
と定義されます。 整数型外部変数 signgam に G(x) の符号が返されます。
特徴
g := Γ(x) を 計算するのに、 signgam∗exp(lgamma(x)) という表現は使えません。 その代わり、 (C言語では)次のようにプログラミングします。
lg = lgamma(x); g = signgam∗exp(lg);
lgammaが 値を 返した後でのみ、 signgam は適切な値に変更されます。 G(x) は、 x が大きすぎるとオーバーフローを、 −x が大きすぎるとアンダーフローを起こします。 また、 x が 0 または負の整数のとき、 0 での除算を 引き起こします。
UNIXにおける C言語用数学ライブラリでは、 今まで関数名 gamma だけが lnG(x) の機能を 持っていました。 他の場合、 例えば、 IBM の FORTRANライブラリでは、 関数名 GAMMA が G を、 また、 関数名 ALGAMA が単精度の lnG を、 関数名 DGAMMA と DLGAMA が倍精度の 関数名として使われていました。 なぜ、 C言語は、 そうなっていないのでしょう?
昔の記録によると、 C言語の gamma は、 その初期の頃に ln(G(|x|)) の値を 返していたということです。 その後、 プログラム gamma は、 負の引数 x に対処するように、 より普遍的な方法に書き換えられました。 しかし、 この変更は、 ドキュメントには正確に記載されませんでした。 最近の変更は、 x が負の時に、 たいてい生じる不確実な値を 補正し、 条件式なしに G(x) を 計算することです。 プログラマは、 lgamma がすでに完成されたものと、 決めてかかるべきではありません。
いずれ、 関数 gamma は復活し、 FORTRAN でそうしているように、 gamma 関数として使われるでしょう。 この理由は、 FORTRAN との互換性からというよりむしろ、 |x| の値が小さいほど計算速度を 速くし、 |x| の値が大きいほど精度が高くなるようにしたいからです。
昔の感覚で、 関数名 gamma を 使いたいプログラマは、 現在 lgamma があるので、 次の 2つの方法のうちどれかを 選択します。
1)1) 旧数学ライブラリ libom を 使う。
2)2) あなたのプログラムに、 次のプログラムを 追加する。
#include <math.h>
double gamma(x)
double x;
{
return (lgamma(x));
}
関連事項
NEWS-OS Release 3.3