EXP(3)

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

書式
#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 は Last Place 内の 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 で、予約済みのオペランド障害を生成します。 VAX と Tahoe では、 errno が EDOM に設定され、 x > 0 の場合を除いて、予約済みオペランドが対数によって返され、 x > -1 の場合を除いて log1p() によって返されます。

注
関数 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 = 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 付近の 0 で分析的な関数であり (拡張可能な累乗シリーズ)、 しかも 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 で現れました。