次: 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を返す。