From: Yukihiro Matsumoto Date: 2008-09-18T07:39:09+09:00 Subject: [ruby-dev:36360] Re: some odd behaviors of BigDecimal まつもと ゆきひろです In message "Re: [ruby-dev:36358] Re: some odd behaviors of BigDecimal" on Thu, 18 Sep 2008 02:17:23 +0900, "Yusuke ENDOH" writes: |2008/09/04 23:46 Yusuke ENDOH : |> BigDecimal のテストを書いていて、いくつか気になる挙動がありました。 |> |> |> 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に合わせた方がよいと思います。