遠藤です。

BigDecimal のテストを書いていて、いくつか気になる挙動がありました。


1) Infinity の n 乗が常に NaN になるのは意図的でしょうか。

 ruby19 -rbigdecimal -e 'x = BigDecimal("Infinity"); p [x**1, x**0, x**-1]'
[#<BigDecimal:8261238,'NaN',4(8)>, #<BigDecimal:8261224,'NaN',4(8)>,
#<BigDecimal:8261210,'NaN',4(8)>]

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)'
#<BigDecimal:826133c,'0.0',4(8)>

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'
#<BigDecimal:8261300,'0.9E2',4(12)>

ちゃんと追ってないですが、3 * 3 * 3 * 3 = 10 * 3 * 3 = 30 * 3 = 90 と
なっているのかなあと思います。仕様だと言われれば納得します。

-- 
Yusuke ENDOH <mame / tsg.ne.jp>