EXP(3)

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

ライブラリ
libm

書式
<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 (または無限または ) であるかを試験するプログラムは 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 です。次いで、**0 = 1 でもあります。 すべての有限および無限な x について、 すなわち x に独立に x**0 = 1 だからです。

関連項目
math(3)

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