MATH(3M) — UNIX Programmer’s Manual
名称
math − 数学ライブラリ関数の概要
解説
ここで述べる一連の関数は、Cの数学ライブラリ libm を構成しています。 オプション “−lm” を指定しておくと、 リンクエディタはこのライブラリを検索します。 これらの関数は、インクルードファイル <math.h> で宣言されています。 また、Fortran の数学ライブラリは、 “man 3f intro” に記述されています。
関数リスト
名称表示ページ概要エラー範囲(ULPs)
acossin.3m逆三角関数3
acoshasinh.3m逆双曲線関数3
asinsin.3m逆三角関数3
asinhasinh.3m逆双曲線関数3
atansin.3m逆三角関数1
atanhasinh.3m逆双曲線関数3
atan2sin.3m逆三角関数2
cabshypot.3m複素数の絶対値1
cbrtsqrt.3m立方根1
ceilfloor.3m引数以上の最小の整数値0
copysignieee.3m符号ビットのコピー0
cossin.3m三角関数1
coshsinh.3m双曲線関数3
dremieee.3m剰余0
erferf.3m誤差関数???
erfcerf.3m補数の誤差関数???
expexp.3m指数関数1
expm1exp.3mexp(x)−1の値1
fabsfloor.3m絶対値0
floorfloor.3m引数以下の最大の整数値0
hypothypot.3mユークリッド距離関数1
j0j0.3mベッセル関数???
j1j0.3mベッセル関数???
jnj0.3mベッセル関数???
lgammalgamma.3m対数ガンマ関数(以前はgamma.3m)
logexp.3m自然対数1
logbieee.3m指数部の取り出し0
log10exp.3m底が10の常用対数3
log1pexp.3mlog(1+x)の値1
mathtrapmathtrap.3m浮動小数点演算の例外トラップの許可/禁止
powexp.3mべき乗 x∗∗y60−500
rintfloor.3m最も近い整数への丸め0
scalbieee.3m指数部の調整0
sinsin.3m三角関数1
sinhsinh.3m双曲線関数3
sqrtsqrt.3m平方根1
tansin.3m三角関数3
tanhsinh.3m双曲線関数3
y0j0.3mベッセル関数???
y1j0.3mベッセル関数???
ynj0.3mベッセル関数???
注記
NEWSでは、数学関数群は、 IEEE 754 規格の2進浮動小数点演算に従っています。
IEEE 754 規格浮動小数点演算
この規格は、他のコンピュータ演算の方式よりも 広く受け入れられるようになりつつあります。 この規格を満たすいくつかのバージョンの VLSI チップが、 多くのメーカーによって作成されており、次のものが良く知られています。
Motorola 68881/68882National Semiconductor 32081
Intel i8087, i80287Weitek WTL-1032, ... , -1165
Zilog Z8070Western Electric (AT&T) WE32106.
モトローラの 68881/68882 は、 atan、cabs、cbrt、erf、erfe、hypot、j0−jn、lgamma、pow、y0−yn 以外の libm 関数をチップ上に持っているので、 これらを高速かつ高精度に計算できます。
IEEE 754 倍精度の属性:
ワードサイズ: 64ビット、8バイト。基数: 2。
精度: 仮数部 53 ビット、有効桁 10進で約16桁。
x と x’ が連続した正の倍精度浮動小数点数の場合 (両者が 1ulp 異なる時)、
1.1e−16 < 0.5∗∗53 < (x’−x)/x ≤ 0.5∗∗52 < 2.3e−16 となります。
範囲:オーバーフロー限界値= 2.0∗∗1024= 1.8e308
アンダーフロー限界値= 0.5∗∗1022= 2.2e−308
オーバーフローした値は、デフォルトで符号付きの ∞ になります。
アンダーフローは段階的(gradual)であり、 0.5∗∗1074 = 4.9e−324 の整数倍で最も近い値に丸められます。
ゼロには、+0 と −0 の2通りの表現があります。
この符号は、乗算あるいは除算において正しく変化しますし、 同じ符号を持つゼロどうしの加算では変化しません。 しかし、すべての有限の x に対して、x−x は +0 になります。 ゼロの符号が顕著に現われる唯一の操作は、 ゼロによる除算または copysign(x, ±0) です。 特に、比較(x > y、x ≥ y など)は、ゼロの符号には影響されません。 しかし、有限の値で x = y ならば、 ∞ = 1/(x−y) ≠ −1/(y−x) = −∞ です。
∞ は符号付きです。
これは、自分自身あるいは他の有限の数に加えても変化しません。 この符号は、乗算または除算において正しく変化し、 (有限数)/±∞ = ±0、 (0以外)/0 = ±∞ となります。 しかし、∞−∞、∞∗0、∞/∞ は、0/0 や sqrt(−3)を 実行したときのように NaN (非数) を発生する無効演算です。
予約数:
予約数は 2∗∗53−2個あり、 すべて NaN(Not a Number)と呼ばれます。 Signaling NaN と呼ばれるものがいくつかあり、 それらに対して実行される浮動小数点処理にはトラップがかかります。 桁落ちした値や初期設定されていない値、および 配列の存在しない要素を明示するのにこれを使用します。 残りは、Quiet NaN です。 これらは、Invalid Operation(無効演算)に対するデフォルトの結果で、 一連の算術演算によって伝播します。 もし、x ≠ x ならば、x は NaN です。 他の述語(x > y、x = y、x < y、...)は、NaN が含まれていると、 すべて偽です。
注意:
「より大」、「より小」、「等しい」といった三分法は、NaN によって 無効になります。 単に等しい等しくないといった比較ではなくて大小関係を比べる述語は、 NaN が含まれていると、常に偽であるばかりでなく、 Invalid Operation のシグナルを発生します。
丸め:
すべての代数演算(+、−、∗、/、 √) は、デフォルトで 1/2ulp 以内で近いほうに丸められます。 丸め誤差がちょうど 1/2ulp の場合、 丸められた値の最下位ビットがゼロになるほうに丸められます。 通常、この種類の丸めは最良のもので、 たとえば、x = 1.0, 2.0, 3.0, 4.0, ..., 2.0∗∗52 の場合、 商と積の両方が丸められるのにもかかわらず、次の式が成り立ちます。
(x/3.0)∗3.0 == x、(x/10.0)∗10.0 == x、...
IEEE 754 のような丸めのみが、これを可能にします。 しかし、 1種類の丸めだけでは、 すべての状況に対して最良の丸めを行うことが出来ません。 そこで IEEE 754 は、プログラマのオプションによって、 ゼロ方向、 +∞方向、 −∞方向への丸めを提供しています。 さらに、2進−10進変換に対して、 少なくとも約 1.0e−10 と 1.0e37 の間の範囲で 同じ種類の丸めが指定されます。
例外:
IEEE 754 には、5種類の浮動小数点例外があります。 起こり得る例外を重要な順で下記にリストします。
例外デフォルトの結果
Invalid OperationNaN あるいは偽
Overflow±∞
Divide by Zero±∞
Underflow段階的アンダーフロー
Inexact丸められた値
注意: 間違った扱いをしなければ、例外はエラーではありません。 例外をいくつかに分類したのは、1つのデフォルト処理では、 すべてのケースに満足に対処できないからです。 一方で、たいていの事例に十分そうな1つのデフォルト処理をつくると、 そのデフォルト処理では間に合わない事例は例外のたびに アボートさせるしかないため、正しい処理とは言えません。
各種の浮動小数点例外のために、IEEE 754 はフラグを用意し、 例外発生のシグナルが送られてきた時、このフラグを立てます。 これは、プログラムがそれをリセットするまでその状態のままです。 また、プログラムでフラグを、検査、保存、復元することができます。 このように、IEEE 754 は3つの方法を提供します。 そのため、プログラムはデフォルトの結果が不十分である例外にも、 対処することができます。
1)あとで例外を生じる可能性のある状況を検査し、それを避けるため分岐します。
2)プログラムがそのフラグをリセットして以来、 例外が生じたかどうかを調べるために、フラグを検査します。
3)結果が例外時にのみ生成される値であるかどうかを検査します。
注意 : アンダーフローが生じたかどうかを 検出する方法で、 唯一確かなものは、 積や商がアンダーフロー限界値よりもゼロに近いかどうかを 検査すること、 あるいはアンダーフローフラグを 検査することです。 (和や差は、IEEE 754 ではアンダーフローを起こしません。 x ≠ y ならば x−y は全精度について正確であり、 それがどんなに小さくてもゼロではありません。) 段階的アンダーフローを生ずる積と商は、 ゼロになるわけではなく、少しずつ精度を失うことになります。 そこで、ゼロと比較しても、精度が落ちたことは分かりません。 幸い、もし段階的にアンダーフローする値が、 アンダーフロー限界値より大きい値に加えられるならば (たいていこういう場合が多いのですが)、 段階的にアンダーフローして生じる桁落ちはどっちにしろ丸められるので、 気にする必要はありません。 そのため、 通常段階的に起こるアンダーフローは、 証明できるほどよくは知られていません。 0にフラッシュされるアンダーフローについては、 同じことは言えません。
IEEE 754 に従って実装する場合、 例外に対処するために別の方法が提供されています。
4)ABORT(異常終了)。 この方法は、 例外を 事例として事前に分類し、 “ON ERROR GO TO ...” のようなエラー処理ステートメントと対応する 伝統的な方法によって処理されます。 言語の違いによって、 このステートメントは異なる形式になりますが、 たいてい次の特徴に分けられます。
—適当な値を異常をおこした演算結果の代わりにして、 その式の途中から処理を 再開するような方法は ありません。 結果は失われます。
—エラー処理ステートメントを欠くサブプログラムで例外を生じた場合、 そのサブプログラムを呼びだしたプログラムがどんなものであっても、 そのプログラムの範囲内でアボートします。 そして、エラー処理ステートメントに出会うまで、 サブプログラムの呼び出しを逆にたどり続けるか、 あるいはタスク全体をアボートさせ、メモリをダンプします。
5)STOP(停止)。 このメカニズムは、 対話的なデバッグ環境を必要とするもので、 プログラムのためというよりもはプログラマのためのものです。 これは、プログラマのエラーの徴候として、 例外を事前に分類します。 この例外は、 異常を起こすような演算のできるだけ近くで実行を一時停止するため、 プログラマは、どのようなエラーかを調べることができます。 通常、最初のいくつかの例外は、 あまり例外的ではないことが明らかになります。 そのため、 演算が停止しなかったかのように実行を再開できることが、 プログラマにとって望ましいものです。
6)... 他の方法は、 このマニュアルの範囲外です。
NEWS-OSでは、浮動小数点演算の例外処理は、 signal(3C) と mathtrap(3M) 関数によって扱われます。 デフォルトでは、 それぞれの例外は無視されます。 しかし、 mathtrap(3M) を使うと 浮動小数点演算の例外をシグナル SIGFPE をおこすようにできます。 signal(3C) に、例外処理ルーチンの書き方があります。 くわしくは、 このマニュアルの signal(3C) と mathtrap(3M) の項を御覧下さい。
関連事項
IEEE 754 の説明およびその拡張である p854 で述べられていることは、 1984年8月出版の IEEE magazine MICRO の W. J. Cody 著、 "A Proposed Radix− and Word−length−independent Standard for Floating−point Arithmetic" で発表されました。 IEEE magazine COMPUTER vol.14 no.13(1981年3月)、 および ACE SIGNUM Newsletter special 1979年10月発行の記事は、 無用になった規格の草案に関するものですが、興味深いものです。
著者
W. Kahan, with the help of Z−S. Alex Liu, Stuart I. McDonald, Dr. Kwok−Choi Ng, Peter Tang.
NEWS-OS Release 3.3