Next: , Previous: , Up: 数値   [Contents][Index]


3.2 浮動小数点数の基礎

浮動小数点数は整数以外の数値の表現に有用です。浮動小数点数の範囲は使用中マシンでのCのデータ型doubleと同じ範囲です。EmacsがサポートするほとんどすべてのコンピューターではIEEEの64ビット浮動小数フォーマットであり、これはIEEE Std 754-2019で標準化されたもので、David Goldbergの論文“What Every Computer Scientist Should Know About Floating-Point Arithmetic”で更に議論されています。モダンなプラットフォームでは浮動小数処理はIEEE-754標準に厳密にしたがいますが、特に32ビットX86のような一部のシステムでは丸めは常に正しい訳ではありません。

一部の古いコンピューターシステムでは、EmacsがIEEEの浮動小数点数を使わないかもしれません。わたしたちが把握している、Emacsが正しく実行されているにも関わらずIEEE-754にしたがわないようなシステムとして、GCC 10.4.0を使用してNetBSDを実行するVAXシステムが挙げられます。このシステムではVAXの‘D_Floating’フォーマットが使用されています。IBMのSystem/370系メインフレームとそのXL/Cコンパイラーも16進浮動小数点数を扱う能力がありますが、今のところEmacsはそのような構成でビルドされていません。

浮動小数点数にたいする入力構文は、小数点と指数のどちらか1つ、または両方を必要とします。オプションの符号(‘+’か‘-’)は、その数字と指数の前に記述します。たとえば‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は値が1500の浮動小数点数を記述する5つの方法です。これらはすべて等価です。Common Lispと同様に、Emacs Lispは指数のない浮動小数点数の小数点の後に少なくとも1つの数字を必要とします。‘1500.’は整数であって浮動小数点数ではありません。

Emacs Lispは=のような数学的な比較に関して、-0.0を通常の0と数学的に同じものとして扱います。これは、(他の処理がこれらを区別するとしても-0.00.0は数学的に等しいとする)IEEE浮動小数点数規格にしたがっています。

IEEE浮動小数点数規格は浮動小数点数として、正の無限大と負の無限大をサポートします。この規格はNaNまたは“not a number(数字ではない)”と呼ばれる値クラスも提供します。正しい答えが存在しないような場合に、数学関数はこのような値をリターンします。たとえば(/ 0.0 0.0)はNaNをリターンします。数値的にNaNはたとえ自身と比較してもすべての値にたいして数値的にイコールになることはありません。NaNは符号と仮数をもち、非数学関数は符号と仮数が一致すれば2つのNaNを等しいものと扱います。NaNの仮数は文字列表現の数字のようにマシン依存です。

NaNはIEEE浮動小数点演算を使用しないシステムでは利用できません。たとえばNaNにたいする読み取り構文をVAXで使用すると、リーダーがエラーをシグナルするでしょう。

NaNと符号つき0が関係する際にはeqlequalsxhash-eqlsxhash-equalgethashのような非数学関数はそれらが数学的にイコールかではなく、値が区別できるかどうかを判断します。たとえばxyが同じNaNなら数値比較を使用する(= x y)nilをリターンするのにたいして(equal x y)tをリターンして、反対に(= 0.0 -0.0)tをリターンするのにたいして(equal 0.0 -0.0)nilをリターンします。

以下は、これらの特別な浮動小数点数にたいする入力構文です:

infinity

1.0e+INF’と‘-1.0e+INF

not-a-number

0.0e+NaN’と‘-0.0e+NaN

以下の関数は浮動小数点数を扱うために特化したものです:

Function: isnan x

この述語は浮動小数引数がNaNならt、それ以外はnilをリターンする。

Function: frexp x

この関数はコンスセル(s . e)をリターンする。ここでseは、浮動小数点数の仮数(浮動小数点数を2の指数表現したときの仮数)と指数である。

xが有限ならsは0.5以上1.0未満の浮動小数点数、eは整数で、 x = s * 2**eとなる。 xが0または無限ならsxと等しくなる。xがNaNならsもNaN。xが0ならeは0。

Function: ldexp s e

数値の仮数sと整数の指数eを与えられると、この関数は浮動小数点数 s * 2**eをリターンする。

Function: copysign x1 x2

この関数はx2の符号をx1の値にコピーして結果をリターンする。x1x2は浮動小数でなければならない。

Function: logb x

この関数はxの2進指数をリターンする。より正確にはxが有限かつ非0なら|x|の2を底とする対数を整数に切り下げた値。xが0または無限なら値は無限大。xがNaNなら値はNaN。

(logb 10)
     ⇒ 3
(logb 10.0e20)
     ⇒ 69
(logb 0)
     ⇒ -1.0e+INF