From: Yusuke ENDOH Date: 2010-01-27T22:03:06+09:00 Subject: [ruby-dev:40186] Re: [Bug #2662] BigDecimal#ceil, etc. should not return Integer 2010年1月27日19:12 Tadayoshi Funaba : >> # 巨大な BigDecimal は ceil が取れない >> $ ./ruby -rbigdecimal -e 'p BigDecimal("1E100000").ceil' >> (巨大な Bignum を確保しようとして固まる...) > > 僕のところでは固まるということはないですね。Rational と比べるとちょっと > 遅いみたいですが。 > > b = BigDecimal("1E100000").ceil > r = Rational("1E100000").ceil > b == r #=> true > > 手元で試したところでは to_r で Rational を経由してから to_i したほうが > 速いみたいです (つまり ceil(0).to_r.to_i のほうが、ceil よりも速い)。よ > うするに BigDecimal#to_i が遅いというのが本質ではないですか。 0 が一個足りませんでした。1E100000 はうちだと 8 秒ですね。1E1000000 だとどうでしょう。 しかし、Rational で動くなら、何かを直せばなんとかなりそうですね。 > >> # Infinity が混ざるときは自分で対処する必要がある >> $ ./ruby -rbigdecimal -e 'p BigDecimal("Infinity").ceil' >> -e:1:in `ceil': Computation results to 'Infinity' (FloatDomainError) >> from -e:1:in `
' > > Infinity に対して ceil が取れないのは Float でも同じなのでそれが間違っ > ているなら、それは BigDecimal だけの問題でもないと思います。 BigDecimal に関しては 1.9.1 なら大丈夫だったのに、1.9.2 で大丈夫じゃ なくなってしまうという問題です。 >> Float#ceil などが Integer を返すのに合わせるためだと思いますが、この変更 >> では BigDecimal のありがたみ自体が減ってしまう気がします。 >> どうしてもということでなければ、revert を提案します。 > > 望むなら ceil を BigDecimal のまま取ることも出来るので (ceil(0))、提案 > の理由で直ちに revert する理由はないように見えます。rubyspec のほうは判 > りません。 「提案の理由で直ちに revert する理由はない」というより、「どうしても 変えないと困る理由がある」でないのであれば、1.9 系列の途中でむやみに 仕様変更しないほうがいいと思います。理由は一貫性だけなんでしょうか。 -- Yusuke ENDOH