Next: Numeric Conversions, Previous: Predicates on Numbers, Up: Numbers [Contents][Index]
数が数値的に等しいかのテストには、eq
ではなく通常は=
を使用するべきです。同じ数値をもつ多くの浮動小数オブジェクトが存在するかもしれません。これらを比較するのにeq
を使用する場合、これは2つの値が同じオブジェクトかどうかをテストすることになります。対照的に=
はオブジェクトの数値的な値だけを比較します。
Emacs
Lispでは、それぞれの整数は一意なLispオブジェクトです。したがって整数に関してはeq
は=
と同じです。未知の整数の値の比較に、eq
を使用する方が便利な場合があります。なぜなら未知の値が数でない場合でもeq
はエラーを報告しないからです。対照的に引数が数でもマーカーでもない場合、=
はエラーをシグナルします。しかし整数の比較においてさえ、使用できる場合は=
を使用するのがよいプログラミング習慣です。
数の比較において、2つの数が同じデータ型(どちらも整数か浮動小数)では、同じ値の場合は等しい数として扱うequal
のほうが便利なときもあります。対照的に=
は整数と浮動小数点数を等しい数と扱うことができます。Equality Predicatesを参照してください。
他の欠点もあります。浮動小数演算は正確ではないので、浮動小数値を比較するのが悪いアイデアとなるときがよくあります。通常は近似的に等しいことをテストするほうがよいでしょう。以下はこれを行なう関数です:
(defvar fuzz-factor 1.0e-6) (defun approx-equal (x y) (or (= x y) (< (/ (abs (- x y)) (max (abs x) (abs y))) fuzz-factor)))
Common Lispに関する注意: Common Lispは複数ワード整数を実装していて、2つの別の整数オブジェクトが同じ数値的な値をもつことができるので、Common Lispでの数の比較はには常に
=
が要求されます。Emacs Lispの整数は範囲が制限されているため、与えられた値に対応する整数オブジェクトは1つだけです。
この関数はすべての引数が数値的に等しいかどうかをテストしてもしそうならt
、それ以外はnil
をリターンする。
この関数はeq
と同様に振る舞うが引数が両方とも数のときを除く。これは数を型と数値的な値により比較するので、(eql 1.0
1)
はnil
をリターンするが、(eql 1.0 1.0)
と(eql 1
1)
は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.0
この関数は引数の最小をリターンする。引数のどれかが浮動小数なら、たとえ最小が整数であっても浮動小数として値がリターンする。
(min -4 1) ⇒ -4
この関数はnumberの絶対値をリターンする。