From: Yusuke ENDOH Date: 2008-09-18T22:43:49+09:00 Subject: [ruby-dev:36380] Re: some odd behaviors of BigDecimal 遠藤です。 2008/09/18 7:39 Yukihiro Matsumoto : > |> 1) Infinity の n 乗が常に NaN になるのは意図的でしょうか。 > |> > |> ruby19 -rbigdecimal -e 'x = BigDecimal("Infinity"); p [x**1, x**0, x**-1]' > |> [#, #, > |> #] > |> > |> inf ** 0 が NaN になるのは定義次第だと思いますが、** 1 と ** -1 は > |> それぞれ inf と 0 を期待していました。 > |> Float だと以下のようになります (うちの環境の場合) 。 > |> > |> $ ruby19 -e 'x = 1.0/0.0; p [x**1, x**0, x**-1]' > |> [Infinity, 1.0, 0.0] > |> > |> > |> 2) 1E1000..(0 がいっぱい)..000 を BigDecimal に与えると 0 が返るのは意図的 > |> でしょうか。 > |> > |> $ ruby19 -rbigdecimal -e 'p BigDecimal("1E1" + "0" * 10000)' > |> # > |> > |> Float だと Infinity になります。 > |> > |> $ ruby19 -e 'p ("1E1" + "0" * 10000).to_f' > |> Infinity > |> > |> > |> 3) limit(1) で 3 ** 4 を計算すると 90 になりますが意図的でしょうか。 > |> > |> $ ruby19 -rbigdecimal -e 'BigDecimal.limit(1); p BigDecimal("3") ** 4' > |> # > |> > |> ちゃんと追ってないですが、3 * 3 * 3 * 3 = 10 * 3 * 3 = 30 * 3 = 90 と > |> なっているのかなあと思います。仕様だと言われれば納得します。 > | > |返事がなかったので、とりあえずすべて意図的と見なしたテストを > |コミットしました。(r19401) > > すみません。最近、BigDecimalが放置気味ですね。 > > 個人的な意見を述べると、3)についてはどうしたもんだか分かりま > せんが、1)と2)についてはFloatに合わせた方がよいと思います。 私もそう思います。そのようにしてコミットしました。 $ ./ruby -rbigdecimal -e '(-2..2).each {|n| p (BigDecimal("-Infinity") ** n).to_f }' 0.0 -0.0 1.0 -Infinity Infinity $ ./ruby -rbigdecimal -e '%w(1E1 -1E1 1E-1 -1E-1).each {|s| p BigDecimal(s + "0" * 10000).to_f }' Infinity -Infinity 0.0 -0.0 -- Yusuke ENDOH