[ruby-dev:38725] [Bug #1720] [NaN] == [NaN] が true になる

View: New views
4 Messages — Rating Filter:   Alert me  

[ruby-dev:38725] [Bug #1720] [NaN] == [NaN] が true になる

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Bug #1720: [NaN] == [NaN] が true になる
http://redmine.ruby-lang.org/issues/show/1720

起票者: tadayoshi funaba
ステータス: Open, 優先度: Normal
Target version: 1.9.x
ruby -v: ruby 1.9.2dev (2009-07-03 trunk 23945) [i686-linux]

NaN = 0.0/0
[NaN] == [NaN] が true になりますが、

NaN == NaN #=> false
[1] == [1.0] #=> true

という結果からするとおかしいように思います。


----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:38734] Re: [Bug #1720] [NaN] == [NaN] が true になる

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:38725] [Bug #1720] [NaN] == [NaN] が true になる"
    on Fri, 3 Jul 2009 21:43:24 +0900, tadayoshi funaba <redmine@...> writes:

|NaN = 0.0/0
|[NaN] == [NaN] が true になりますが、
|
|NaN == NaN #=> false
|[1] == [1.0] #=> true
|
|という結果からするとおかしいように思います。

確かに。rb_equal()が両辺が同じオブジェクトのときにメソッド呼
び出しを行わずに真を返しているせいですね。NaNというのは、
equal?が成立しても==が成立しないという特異なオブジェクトであ
るためにこの問題が発生しています。

とはいえ、こんな特殊な例のために同値性チェックを遅くしたくな
いし、困ったものです。


[ruby-dev:38735] Re: [Bug #1720] [NaN] == [NaN] が true になる

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:38734] Re: [Bug #1720] [NaN] == [NaN] が true になる"
    on Sun, 5 Jul 2009 01:14:16 +0900, Yukihiro Matsumoto <matz@...> 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)が好きです。


[ruby-dev:38772] Re: [Bug #1720] [NaN] == [NaN] が true になる

by Keiju ISHITSUKA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

けいじゅ@いしつかです.

In [ruby-dev:38735] the message: "[ruby-dev:38735] Re: [Bug #1720]
[NaN] == [NaN] が true になる", on Jul/05 01:31(JST) Yukihiro
Matsumoto writes:

>まつもと ゆきひろです

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

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

わたしも, (1)のような気がします.

というか, (1')ですか:

(1')
nan1 = 0.0/0
nan2 = 0.0/0

として,

nan1 == nan1 => true
nan1 == nan2 => false

現行では,

  nan1.equal?(nan1)

なのに,

  nan1 == nan1 => false

となるのは,オブジェクト指向的にかなり気分の悪い仕様だと思います. nan1
とnan1の値はやはり同じだとしてよいと思います.

>      一貫性はあるが NaN の本来の挙動ではない

とありますが, それに関しては nan1 == nan2 => false になれば問題ないき
がします.


__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@... <<---