Next: Predicates on Numbers, Previous: Integer Basics, Up: Numbers [Contents][Index]
浮動小数点数は整数以外の数値の表現に有用です。浮動小数点数の範囲は使用中のシンでの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のような陳腐化したプラットフォームでは丸めは常に正しい訳ではありません。
浮動小数点数にたいする入力構文は、小数点と指数のどちらか1つ、または両方が必要とします。オプションの符号(‘+’か‘-’)は、その数字と指数の前に記述します。たとえば‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は値が1500の浮動小数点数を記述する5つの方法です。これらはすべて等価です。Common Lispと同様、Emacs Lispは浮動小数点数の小数点の後に少なくとも1つの数字を必要とします。‘1500.’は整数であって浮動小数点数ではありません。
Emacs
Lispは=
のような数学的な比較に関して、-0.0
を通常の0と数学的に同じものとして扱います。これは、(他の処理がこれらを区別するとしても-0.0
と0.0
は数学的に等しいとする)IEEE浮動小数点数規格にしたがっています。
IEEE浮動小数点数規格は浮動小数点数として、正の無限大と負の無限大をサポートします。この規格はNaNまたは“not a
number(数字ではない)”と呼ばれる値クラスも提供します。正しい答えが存在しないような場合に、数学関数はこのような値をリターンします。たとえば(/
0.0
0.0)
はNaNをリターンします。数値的にNaNはたとえ自身と比較してもすべての値にたいして数値的にイコールになることはありません。NaNは符号と仮数をもち、非数学関数は符号と仮数が一致すれば2つのNaNを等しいものと扱います。NaNの仮数は文字列表現の数字のようにマシン依存です。
NaNと符号つき0が関係する際にはeql
、equal
、sxhash-eql
、sxhash-equal
、gethash
のような非数学関数はそれらが数学的にイコールかではなく、値が区別できるかどうかを判断します。たとえばxとyが同じNaNなら数値比較を使用する(=
x y)
はnil
をリターンするのにたいして(equal x y)
はt
をリターンして、反対に(=
0.0 -0.0)
がt
をリターンするのにたいして(equal 0.0 -0.0)
はnil
をリターンします。
以下は、これらの特別な浮動小数点数にたいする入力構文です:
‘1.0e+INF’と‘-1.0e+INF’
‘0.0e+NaN’と‘-0.0e+NaN’
以下の関数は浮動小数点数を扱うために特化したものです:
この述語は浮動小数引数がNaNならt
、それ以外はnil
をリターンする。
この関数はコンスセル(s
.
e)
をリターンする。ここでsとeは、浮動小数点数の仮数(浮動小数点数を2の指数表現したときの仮数)と指数である。
xが有限ならsは0.5以上1.0未満の浮動小数点数、eは整数で、 x = s * 2**eとなる。 xが0または無限ならsはxと等しくなる。xがNaNならsもNaN。xが0ならeは0。
数値の仮数sと整数の指数eを与えられると、この関数は浮動小数点数 s * 2**eをリターンする。
この関数はx2の符号をx1の値にコピーして結果をリターンする。x1とx2は浮動小数でなければならない。
この関数はxの2進指数をリターンする。より正確にはxが有限かつ非0なら|x|の2を底とする対数を整数に切り下げた値。xが0または無限なら値は無限大。xがNaなら値はNaN。
(logb 10) ⇒ 3 (logb 10.0e20) ⇒ 69 (logb 0) ⇒ -1.0e+INF