Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

math(3M)

infnan(3M)

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));

}

関連事項

math(3M), infnan(3M)

NEWS-OS Release 3.3

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026