.\" Copyright (c) 1985, 1991 Regents of the University of California. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" from: @(#)exp.3 6.12 (Berkeley) 7/31/91 .\" %FreeBSD: src/lib/msun/man/exp.3,v 1.9.2.4 2001/12/17 10:08:36 ru Exp % .\" .\" $FreeBSD$ .Dd July 31, 1991 .Dt EXP 3 .Os .Sh 名称 .Nm exp , .Nm expf , .Nm exp10 , .Nm exp10f , .Nm expm1 , .Nm expm1f , .Nm log , .Nm logf , .Nm log10 , .Nm log10f , .Nm log1p , .Nm log1pf , .Nm pow , .Nm powf .Nd 指数関数、対数関数、累乗関数 .Sh ライブラリ .Lb libm .Sh 書式 .In math.h .Ft double .Fn exp "double x" .Ft float .Fn expf "float x" .Ft double .Fn expm1 "double x" .Ft float .Fn expm1f "float x" .Ft double .Fn log "double x" .Ft float .Fn logf "float x" .Ft double .Fn log10 "double x" .Ft float .Fn log10f "float x" .Ft double .Fn log1p "double x" .Ft float .Fn log1pf "float x" .Ft double .Fn pow "double x" "double y" .Ft float .Fn powf "float x" "float y" .Sh 解説 .Fn exp 関数と .Fn expf 関数は、指定の引数 .Fa x の指数値を計算します。 .Pp .Fn expm1 関数と .Fn expm1f 関数は、小さい引数 .Fa x についてさえ正確に、exp(x)\-1 の値を計算します。 .Pp .Fn log 関数と .Fn logf 関数は引数 .Fa x の自然対数の値を計算します。 .Pp .Fn log10 関数と .Fn log10f 関数は、基底 10 について引数 .Fa x の対数を計算します。 .Pp .Fn log1p 関数と .Fn log1pf 関数は、小さい引数 .Fa x についてさえ log(1+x) の値を正確に計算します。 .Pp .Fn pow 関数と .Fn powf 関数は、指数 .Ar y に対して .Ar x の値を計算します。 .Sh 誤差 (丸めなどのためによる) .Fn exp x , .Fn log x , .Fn expm1 x および .Fn log1p x は、1 .Em ulp 内部で正確です。 .Fn log10 x は 2 .Em ulps 内部で正確です。1 .Em ulp は .Em 最後の .Em 場所 での 1 .Em 単位 です。 .Fn pow x y の誤差は、大きさが中程度のときは約 2 .Em ulps 未満です。 .Fn pow x y がオーバフロー/アンダフローしきい値に近づくと増大します。最後には、 ほとんどすべてのビットが浮動小数点指数フィールドによって占められて 失われます。これは .Tn "VAX D" では 8 ビットであり、IEEE 754 Double では 11 ビットです。 このように大きな欠落は試験によって明らかにされていません。 観察された最悪の誤差は、 .Tn "VAX D" については 20 .Em ulps 未満。 .Tn IEEE 754 Double については 300 .Em ulps です。 .Fn pow 中程度の値が、 .Fn pow integer integer が正確になるために十分です。最後は、 .Tn VAX については 2**56 より大きくなり、 .Tn IEEE 754 については 2**53 より大きくなります。 .Sh 戻り値 これらの関数は、誤差が発生するか引数が範囲外の場合を除き、 適切な計算を返します。関数 .Fn exp , .Fn expm1 , .Fn pow は、計算された値がオーバフローするかどうか検出し、 グローバル変数 .Va errno を .Er ERANGE に設定し、 .Tn VAX または .Tn Tahoe で予約オペランドフォルトを発生させます。関数 .Fn pow x y は、 .Fa x < 0 か .Fa y が整数でないかチェックします。 この場合、グローバル変数 .Va errno を .Er EDOM に設定し、 .Tn VAX と .Tn Tahoe で、予約オペランドフォルトを生成します。 .Fa x > 0 でない場合の log と、 .Fa x > \-1 でない場合の .Fn log1p は、 .Tn VAX と .Tn Tahoe では、 .Va errno が .Er EDOM に設定され、予約オペランドフォルトが返されます。 .Sh 注 関数 exp(x)\-1 と log(1+x) は、Hewlett Packard .Tn HP Ns \-71B および .Tn APPLE の Macintosh の .Tn BASIC では expm1 と logp1 と呼ばれ、Pascal では .Tn EXP1 と .Tn LN1 と呼ばれ、 .Tn APPLE Macintosh の C では exp1 と log1 と呼ばれます。 この場合、これらは ((1+x)**n\-1)/x すなわち expm1(n\(**log1p(x))/x の財政的計算が x が小さい場合に正確になることを確認するために備えられています。 これらは正確な逆双曲線関数も提供します。 .Pp 関数 .Fn pow x 0 は、すべての x について x**0 = 1 を返します。 x には、x = 0、 .if n \ infinity .if t \ \(if .Tn ( VAX にはありません)、 .Em NaN .Tn ( VAX の予約オペランド) が含まれます。 pow のこれまでの実装は、これらのすべての場合またはいくつかの場合に、 x**0 を未定義としてきたことがあります。 これが必ず x**0 = 1 を返す理由です。 .Bl -enum -width indent .It x**0 を計算する前に x が 0 (または無限または \*(Na) であるかを試験するプログラムは 0**0 = 1 であるかどうかを配慮できません。 0**0 が無効であることに左右されるプログラムは、 式の意味と、無効な場合、 式の結果がコンピュータシステムごとに変化するため疑わしいものです。 .It 算術テキスト (たとえば、Sigler のもの) には、 x = 0 を含めてすべての x について x**0 = 1 を定義するものがあります。 これは、a[0] を、a[0]\(**0**0 を無効として拒絶するのではなく、多項式 .Bd -literal -offset -indent p(x) = a[0]\(**x**0 + a[1]\(**x**1 + a[2]\(**x**2 +...+ a[n]\(**x**n .Ed .Pp の値を a[0] として受け入れる慣行と互換性があります。 .It アナリストは、x と y が独立に 0 に近づくときに、 x**y が特定の値に近づくかまたは何にも近づかないかに関わらず、 0**0 = 1 を受け入れます。 0**0 = 1 を受け入れる理由は次のとおりです。 .Bd -filled -offset indent x(z) と y(z) が z = 0 付近の z で分析的な関数であり (累乗の連続で拡張可能)、 しかも x(0) = y(0) = 0 の場合、z \(-> 0 のとき x(z)**y(z) \(-> 1 です。 .Ed .It 0**0 = 1 の場合、 .if n \ infinity**0 = 1/0**0 = 1 .if t \ \(if**0 = 1/0**0 = 1 です。次いで、\*(Na**0 = 1 でもあります。 すべての有限および無限な x について、 すなわち x に独立に x**0 = 1 だからです。 .El .Sh 関連項目 .Xr math 3 .Sh 歴史 .Fn exp , .Fn log および .Fn pow 関数は .At v6 で登場しました。 .Fn log10 関数は .At v7 で現れました。 .Fn log1p 関数と .Fn expm1 関数は .Bx 4.3 で登場しました。