数値にたいして数学的な等価性をテストするには通常はeq
、eql
、equal
のような非数値的な比較述語のかわりに=
を使用するべきです。異なる浮動小数点オブジェクトと大きい整数オブジェクトを数値的に等しくすることができます。これらの比較にeq
を使用した場合にはそれらが同一のオブジェクトかどうかを、eql
やequal
を使用した場合にはそれらの値が区別不能かどうかをテストすることになります。対照的に=
は数値比較を使用して、非数値的な比較がnil
をリターンするような場合にt
をリターンしたり、その逆もあり得ます。浮動小数点数の基礎を参照してください。
Emacs
Lispでは2つのfixnumが数値的に等しければ同一のLispオブジェクトです。つまりfixnumではeq
は=
と同じです。値が未知のfixnumの比較にeq
を使用する方が便利な場合があります。なぜなら未知の値が数でない場合でもeq
はエラーを報告しないからです。これは任意のタイプの引数を受け付けます。対照的に引数が数でもマーカーでもなければ=
はエラーをシグナルします。しかし整数の比較においてさえ、使用できる場合には=
を使用するのがよいプログラミング習慣です。
数の比較において、2つの数が同じデータ型(どちらも整数であるかどちらも浮動小数であるか)で同じ値の場合は等しい数として扱うeql
やequal
のほうが便利なときもあります。対照的に=
は整数と浮動小数点数を(訳注:同じ値の場合には)等しい数と扱うことができます。同等性のための述語を参照してください。
他の欠点もあります。浮動小数演算は正確ではないので、浮動小数値を比較するのが悪いアイデアとなるときがよくあります。通常は近似的に等しいことをテストするほうがよいでしょう。以下はこれを行なう関数です:
(defvar fuzz-factor 1.0e-6) (defun approx-equal (x y) (or (= x y) (< (/ (abs (- x y)) (max (abs x) (abs y))) fuzz-factor)))
この関数はすべての引数が数値的に等しいかどうかをテストしてもしそうならt
、それ以外はnil
をリターンする。
この関数はeq
と同様に振る舞うが引数が両方とも数のときを除く。これは数を型と数値的な値により比較するので(eql 1.0
1)
はnil
をリターンするが、(eql 1.0 1.0)
と(eql 1
1)
はt
をリターンする。これは小さい整数と同様に大きい整数の比較に使用できる。符号、指数部、小数部が同じ浮動小数点数はeql
であり、これは数値の比較とは異なる。(eql
0.0 -0.0)
はnil
、(eql 0.0e+NaN
0.0e+NaN)
はt
をリターンするが、これは=
の動作とは逆である。
この関数は引数が数値的に等しいかどうかをテストして、もし異なる場合はt
、等しい場合はnil
をリターンする。
この関数は、各引数それぞれを後の引数より小さいかどうかをテストしてもしそうならt
、それ以外はnil
をリターンする。
この関数は、各引数それぞれが後の引数以下かどうかをテストしてもしそうならt
、それ以外はnil
をリターンする。
この関数は、各引数それぞれが後の引数より大きいかどうかをテストしてもしそうならt
、それ以外はnil
をリターンする。
この関数は、各引数それぞれが後の引数以上かどうかをテストしてもしそうならt
、それ以外はnil
をリターンする。
この関数は最大の引数をリターンする。
(max 20) ⇒ 20 (max 1 2.5) ⇒ 2.5 (max 1 3 2.5) ⇒ 3
この関数は最小の引数をリターンする。
(min -4 1) ⇒ -4
この関数はnumberの絶対値をリターンする。