GNU Emacs Lisp Reference Manual 3.4 Comparison of Numbers

数値を数値的に同値かテストするためには, 通常, `eq' ではなく, `=' を使うべきです.
同じ値であるたくさんの明確な浮動小数点数オブジェクトが存在しえます.
もしそれらを比較するために, `eq' を使うなら, そのとき, 2つの値が同じ object かどうかテストします.
対照的に, `=' は, オブジェクトの数値のみを比較します.


現在では, それぞれの整数値は, Emacs Lisp において, 一意な Lisp オブジェクトを持ちます.
それゆえに, `eq' は, 整数に関する `=' と等価です. それはときどき, 整数と不明な値を比較するときに `eq' を使うことは便利です.
なぜなら, `eq' は, 不明な値が数値でない場合にもエラーを報告しないためです. あらゆる型の引数を受けつけます.
対照的に, `=' は, 引数が数値, もしくは, マーカでないとき, エラーを報告します.
しかしながら, 整数同士の比較においても, 未来の Emacs バージョンにおいて整数の表現の変更がある場合に備えて, できるなら, `=' を使う方が良いでしょう.


ときどき, 数値同士を `equal' で比較することは役立ちます.
それは, 2つの数値が同じデータ構造を持ち( 両方が整数, もしくは, 両方が浮動小数点数 ), 同じ値ならば, 同じであると扱います.
対照的に, `=' は, 整数と浮動小数点数が同じであることを取り扱えます. Equality Predicates:: を参照して下さい.


別のこともあります. 浮動小数点演算が正確でない場合, 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つの整数オブジェクトのみを持てる.

-- 関数: = number-or-marker1 number-or-marker2
この関数は, 引数が数値的に同じかどうかをテストし, もしそうならば, `t'を, そうでないならば, `nil' を返します.
-- 関数: eql value1 value2
この関数は, 両方の引数が数値であるときを除いて, `eq' のように振舞います. 型と数値によって数値を比較します. そのため, `(eql 1.0 1)' は, `nil' を返しますが, `(eql 1.0 1.0)' と `(eql 1 1)' は, 両方 `t' を返します.
-- 関数: /= number-or-marker1 number-or-marker2
この関数は, その引数が数値的に同じかどうかテストし, もしそうでなければ, `t' を, そうであれば, `nil' を返します.
-- 関数: < number-or-marker1 number-or-marker2
この関数は, その第1引数が正確にその第2引数より低いかどうかをテストします. もしそうならば, `t' を そうでなければ, `nil' を返します.
-- 関数: <= number-or-marker1 number-or-marker2
この関数は, その第1引数がその第2引数より低い, もしくは, 同じかどうかをテストします. もしそうならば, `t' を, そうでなければ, `nil' を返します.
-- 関数: > number-or-marker1 number-or-marker2
この関数は, 第1引数が厳密にその第2引数より大きいかどうかをテストします. もしそうならば, `t' を返し, そうでなければ, `nil' を返します.
-- 関数: >= number-or-marker1 number-or-marker2
この関数は, その第1引数がその第2引数より大きい, もしくは, 同じかどうかをテストします. もしそうならば, `t' を, そうでなければ, `nil' を返します.
-- 関数: max number-or-marker &rest numbers-or-markers
この関数は, その引数の大きいものを返します. もし引数の何らかが, 浮動小数点ならば, その値は, もし整数として与えられていたとしても, 浮動小数点として返されます.

     (max 20)
          => 20
     (max 1 2.5)
          => 2.5
     (max 1 3 2.5)
          => 3.0


-- 関数: min number-or-marker &rest numbers-or-markers


この関数は, その引数の小さいものを返します. もし引数の何らかが, 浮動小数点ならば, その値は, もし整数として与えられていたとしても, 浮動小数点として返されます.

     (min -4 1)
          => -4


-- 関数: abs number


この関数は, NUMBER の値の絶対値を返します.

注意


なんとなく翻訳してみただけなので, 誤訳があると思います.
この元のマニュアルは, GNU Emacs 23.0.50.2 (i686-pc-linux-gnu, GTK+ Version 2.8.20) of 2007-10-08 on khlin015 に付属してきたものです.
また, この先続くかどうかは, 不明です.
続くかどうかは, 気分しだいです.
誤訳, 日本語が変等の間違いがあったら, 指摘して頂けると嬉しいです.


/= の挙動が想像と全然違って驚いた...
C言語Java などにあるそれを想像してた.


eq, =, eql は, 文章だけではよくわからんかったので, 対比をばやってみた.

;; 浮動小数点数同士
(eq  1.0 1.0)  ; nil
(=   1.0 1.0)  ; t
(eql 1.0 1.0)  ; t

;; 整数と浮動小数点数
(eq  1.0 1)    ; nil
(=   1.0 1)    ; t
(eql 1.0 1)    ; nil

;; 整数同士
(eq  1 1)      ; t
(=   1 1)      ; t
(eql 1 1)      ; t

更新時刻


2007年, 10月28日, 7:50