From: Yukihiro Matsumoto <matz@...>
Date: 2009-07-05T01:31:36+09:00
Subject: [ruby-dev:38735] Re: [Bug #1720] [NaN] == [NaN] 	が true 			になる

まつもと ゆきひろです

In message "Re: [ruby-dev:38734] Re: [Bug #1720] [NaN] == [NaN] 	が true 		になる"
    on Sun, 5 Jul 2009 01:14:16 +0900, Yukihiro Matsumoto <matz@ruby-lang.org> writes:

||NaN = 0.0/0
||[NaN] == [NaN] が true になりますが、
||
||NaN == NaN #=> false
||[1] == [1.0] #=> true
||
||という結果からするとおかしいように思います。
|
|確かに。rb_equal()が両辺が同じオブジェクトのときにメソッド呼
|び出しを行わずに真を返しているせいですね。NaNというのは、
|equal?が成立しても==が成立しないという特異なオブジェクトであ
|るためにこの問題が発生しています。

考えられる対処は

  (1) NaN == NaN も true にする
      一貫性はあるが NaN の本来の挙動ではない
  (2) rb_equal()でまずequal?でのチェックをやめる
      性能が劣化するので避けたい
  (3) rb_equal()でT_FLOATを特別扱い
      2ほどではないにしても性能劣化が気になる
      特別扱いは後悔することが多い
  (4) このまま。これは例外的なケースとする

くらいでしょうか。

私自身は、どれが良いという意見を現時点では持たないのですが、
どれが好きかと言われれば、(1)が好きです。