次: Numeric Conversions, 前: Predicates on Numbers, 上: Numbers
2つの数が数値的に等しいかどうか調べるには、普通、
eq
ではなく=
を使うべきです。
数値的には等しい多くの異なる浮動小数点数が存在しえます。
それらの比較にeq
を使うと、
2つの値が同一オブジェクトかどうか調べることになります。
対照的に、=
はオブジェクトの数値だけを比較します。
現時点では、Emacs Lispにおいて、各整数値は一意なLispオブジェクトです。
したがって、整数に限ればeq
は=
と等価です。
未知の値と整数を比較するためにeq
を使うと便利な場面があります。
というのは、eq
は任意の型の引数を受け付けるので、
eq
は未知の値が数でなくてもエラーを報告しないからです。
対照的に、=
は、引数が数やマーカでないと、エラーを通知します。
しかしながら、Emacsの将来の版で整数の表現方法を変更する場合に備えて、
整数を比較するときであっても、可能ならば、=
を使うほうがよいでしょう。
equal
で数を比較したほうが便利なこともあります。
equal
は、2つの数が同じデータ型
(どちらも整数であるか、どちらも浮動小数点数である)で、
同じ値であれば、2つの数を等しいと扱います。
一方、=
は、整数と浮動小数点数が等しいことを扱えます。
別のことがらもあります。 浮動小数点数演算は厳密ではないので、 2つの浮動小数点数が等しいかどうか調べるのは正しくありません。 普通、近似的に等しいことを調べるほうがよいのです。 つぎの関数はそのようにします。
(defvar fuzz-factor 1.0e-6) (defun approx-equal (x y) (or (and (= x 0) (= y 0)) (< (/ (abs (- x y)) (max (abs x) (abs y))) fuzz-factor)))
Common Lispに関した注意:
Common Lispでは、数の比較にはつねに=
を使う必要がある。
というのは、Common Lispでは複数ワードの整数を実装しているため、
2つの異なる整数オブジェクトが同じ数値を表すことがありえる。
Emacs Lispでは、整数値の範囲が制限されているため、
任意の値の整数オブジェクトはそれぞれ1つしかない。
この関数は、第1引数が第2引数より小さいか、あるいは、等しいか調べ、 そうならば
t
を返し、さもなければnil
を返す。
この関数は、第1引数が第2引数より大きいか、あるいは、等しいか調べ、 そうならば
t
を返し、さもなければnil
を返す。