From: Tadayoshi Funaba Date: 2010-01-27T19:12:45+09:00 Subject: [ruby-dev:40183] Re: [Bug #2662] BigDecimal#ceil, etc. should not return Integer ちょっと試してみました。 > r20584 と r20616 で BigDecimal#ceil 、truncate 、floor 、round 、div の > 戻り値を Integer にする変更がありますが、これだと巨大な BigDecimal を > 扱えなく、または扱いが面倒になります。 > > > # 巨大な 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 が遅いというのが本質ではないですか。 > # 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 だけの問題でもないと思います。 > Float#ceil などが Integer を返すのに合わせるためだと思いますが、この変更 > では BigDecimal のありがたみ自体が減ってしまう気がします。 > どうしてもということでなければ、revert を提案します。 望むなら ceil を BigDecimal のまま取ることも出来るので (ceil(0))、提案 の理由で直ちに revert する理由はないように見えます。rubyspec のほうは判 りません。