Next: , Previous: Predicates on Numbers, Up: Numbers


3.4 数の比較

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つしかない。
— Function: = number-or-marker1 number-or-marker2

この関数は、引数が数値的に等しいか調べ、 そうならばtを返し、さもなければnilを返す。

— Function: /= number-or-marker1 number-or-marker2

この関数は、引数が数値的に等しいか調べ、 等しくなければtを返し、等しければnilを返す。

— Function: < number-or-marker1 number-or-marker2

この関数は、第1引数が第2引数より小さいか調べ、 そうならばtを返し、さもなければnilを返す。

— Function: <= number-or-marker1 number-or-marker2

この関数は、第1引数が第2引数より小さいか、あるいは、等しいか調べ、 そうならばtを返し、さもなければnilを返す。

— Function: > number-or-marker1 number-or-marker2

この関数は、第1引数が第2引数より大きいか調べ、 そうならばtを返し、さもなければnilを返す。

— Function: >= number-or-marker1 number-or-marker2

この関数は、第1引数が第2引数より大きいか、あるいは、等しいか調べ、 そうならばtを返し、さもなければnilを返す。

— Function: max number-or-marker &rest numbers-or-markers

この関数は、引数の中で最大のものを返す。

          (max 20)
               ⇒ 20
          (max 1 2.5)
               ⇒ 2.5
          (max 1 3 2.5)
               ⇒ 3
— Function: min number-or-marker &rest numbers-or-markers

この関数は、引数の中で最小のものを返す。

          (min -4 1)
               ⇒ -4
— Function: abs number

この関数は、numberの絶対値を返す。