スポンサーリンク

EXP(3) FreeBSD ライブラリ関数マニュアル EXP(3)

名称

exp, expf, exp10, exp10f, expm1, expm1f, log, logf, log10, log10f, log1p, log1pf, pow, powf − 指数関数、対数関数、累乗関数

ライブラリ

数値計算ライブラリ (libm, −lm)

書式

#include <math.h>

double

exp(double x);

float

expf(float x);

double

expm1(double x);

float

expm1f(float x);

double

log(double x);

float

logf(float x);

double

log10(double x);

float

log10f(float x);

double

log1p(double x);

float

log1pf(float x);

double

pow(double x, double y);

float

powf(float x, float y);

解説

exp() 関数と expf() 関数は、指定の引数 x の指数値を計算します。

expm1() 関数と expm1f() 関数は、小さい引数 x についてさえ正確に、exp(x)−1 の値を計算します。

log() 関数と logf() 関数は引数 x の自然対数の値を計算します。

log10() 関数と log10f() 関数は、基底 10 について引数 x の対数を計算しま す。

log1p() 関数と log1pf() 関数は、小さい引数 x についてさえ log(1+x) の値を 正確に計算します。

pow() 関数と powf() 関数は、指数 y に対して x の値を計算します。

誤差 (丸めなどのためによる)

exp(x), log(x), expm1(x) および log1p(x) は、1 ulp 内部で正確です。 log10(x) は 2 ulps 内部で正確です。1 ulp は 最後の 場所での 1 単位です。 pow(x, y) の誤差は、大きさが中程度のときは約 2 ulps 未満です。 pow(x, y) がオーバフロー/アンダフローしきい値に近づくと増大します。最後には、ほとん どすべてのビットが浮動小数点指数フィールドによって占められて失われます。 これは VAX D では 8 ビットであり、IEEE 754 Double では 11 ビットです。こ のように大きな欠落は試験によって明らかにされていません。観察された最悪の 誤差は、 VAX D については 20 ulps 未満。 IEEE 754 Double については 300 ulps です。 pow() 中程度の値が、 pow(integer, integer) が正確になるために 十分です。最後は、 VAX については 2**56 より大きくなり、 IEEE 754 につい ては 2**53 より大きくなります。

戻り値

これらの関数は、誤差が発生するか引数が範囲外の場合を除き、適切な計算を返 します。関数 exp(), expm1(), pow() は、計算された値がオーバフローするかど うか検出し、グローバル変数 errno を ERANGE に設定し、 VAX または Tahoe で 予約オペランドフォルトを発生させます。関数 pow(x, y) は、 x < 0 か y が整 数でないかチェックします。この場合、グローバル変数 errno を EDOM に設定 し、 VAX と Tahoe で、予約オペランドフォルトを生成します。 x > 0 でない場 合の log と、 x > −1 でない場合の log1p() は、 VAX と Tahoe では、 errno が EDOM に設定され、予約オペランドフォルトが返されます。

関数 exp(x)−1 と log(1+x) は、Hewlett Packard HP−71B および APPLE の Macintosh の BASIC では expm1 と logp1 と呼ばれ、Pascal では EXP1 と LN1 と呼ばれ、 APPLE Macintosh の C では exp1 と log1 と呼ばれます。この場 合、これらは ((1+x)**n−1)/x すなわち expm1(n∗log1p(x))/x の財政的計算が x が小さい場合に正確になることを確認するために備えられています。これらは正 確な逆双曲線関数も提供します。

関数 pow(x, 0) は、すべての x について x**0 = 1 を返します。 x には、x = 0、 infinity (VAX にはありません)、 NaN (VAX の予約オペランド) が含まれま す。 pow のこれまでの実装は、これらのすべての場合またはいくつかの場合に、 x**0 を未定義としてきたことがあります。これが必ず x**0 = 1 を返す理由で す。

       1.    x**0 を計算する前に x が 0 (または無限または NaN) であるかを試験するプログラムは 0**0 = 1 であるかどうかを配慮できません。 0**0が無効であることに左右されるプログラムは、式の意味と、無効な場合、式の結果がコンピュータシステムごとに変化するため疑わしいものです。

2. 算術テキスト (たとえば、Sigler のもの) には、 x = 0 を含めてすべ ての x について x**0 = 1 を定義するものがあります。これは、a[0] を、a[0]∗0**0 を無効として拒絶するのではなく、多項式

p(x) = a[0]∗x**0 + a[1]∗x**1 + a[2]∗x**2 +...+ a[n]∗x**n

の値を a[0] として受け入れる慣行と互換性があります。

       3.    アナリストは、x と y が独立に 0 に近づくときに、 x**y が特定の値に近づくかまたは何にも近づかないかに関わらず、 0**0 = 1 を受け入れます。 0**0 = 1 を受け入れる理由は次のとおりです。

x(z) と y(z) が z = 0 付近の z で分析的な関数であり (累乗の 連続で拡張可能)、しかも x(0) = y(0) = 0 の場合、z → 0 の と き x(z)**y(z) → 1 です。

       4.    0**0 = 1 の場合、 infinity**0 = 1/0**0 = 1 です。次いで、NaN**0 =1 でもあります。すべての有限および無限な x について、すなわち xに独立に x**0 = 1 だからです。

関連項目

math(3)

歴史

exp(), log() および pow() 関数は Version 6 AT&T UNIX で登場しました。 log10() 関数は Version 7 AT&T UNIX で現れました。 log1p() 関数と expm1() 関数は 4.3BSD で登場しました。

FreeBSD 10.0 July 31, 1991 FreeBSD 10.0

スポンサーリンク