From: Kenta Murata Date: 2011-07-31T23:37:40+09:00 Subject: [ruby-dev:44280] Re: 1.9.3 (以降) の BigDecimal について むらたです。 On Sunday, July 31, 2011 at 22:51 , Tadayoshi Funaba wrote: > > 後者の暗黙的変換については、相手の BigDecimal に合わせて精度を決定できます。 > > BigDecimal(Rational(Math::PI),100) > #=> # > > Rational(Math::PI) + BigDecimal('0.' + '0' * 50 + '1') > #=> # > > 単に桁が増えただけに見えます。 > > 常識的に考えて影響が少なそうな零を加算をすると最低限の精度になる、とい > うのであれば、明示的な変換で必須にする事もあまり意味がないような気がし > ます。 現在の bigdecimal は精度の仕様に問題がある事を前提に以下の話を読んで下さい。 小数点以下の桁数 (確度; accuracy) と、数値の有効桁数 (精度; precision) は事なる概念です。 coerce が使うのは精度です。精度には、先頭の0の列を桁数には含みません。 以下のように、長い有効数字を持つ BigDecimal を用いて coerce すると、 Rational から変換された BigDecimal の有効数字が coerce のレシーバが持つ 有効数字に対応している事が分かると思います。 BigDecimal("0." + "1"*50+"1").coerce(Rational(Math::PI)) #=> [#, #] bigdecimal の精度の仕様は、標準添付された当初から存在しています。 どういう問題かというと、10進法での桁数で精度が保存されない事、 確度が実装されてない事、そして末尾のゼロの列を有効数字に入れられない事です。 この問題のため、たとえば「有効数字50桁のゼロ」は作れません。 残念ながら 1.9.3 に修正を間に合わせることはできそうにないので、 次のリリースまでに対応することを目指しています。 -- Kenta Murata Sent with Sparrow (http://www.sparrowmailapp.com)