.\" 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 .\" %Id: exp.3,v 1.6 1997/02/22 15:09:30 peter Exp % .\" .\" $FreeBSD$ .\" .Dd July 31, 1991 .Dt EXP 3 .Os BSD 4 .Sh 名称 .Nm exp , .Nm expf , .Nm exp2 , .Nm exp2f , .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 書式 .Fd #include .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 Last .Em Place 内の 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 で、予約済みのオペランド障害を生成します。 .Tn VAX と .Tn Tahoe では、 .Va errno が .Er EDOM に設定され、 .Fa x > 0 の場合を除いて、予約済みオペランドが対数によって返され、 .Fa x > \-1 の場合を除いて .Fn log1p によって返されます。 .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 がゼロ (または無限または \*(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 付近の 0 で分析的な関数であり (拡張可能な累乗シリーズ)、 しかも 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 で現れました。