From: Yukihiro Matsumoto 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 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)が好きです。