From: Shigeo Kobayashi Date: 2002-04-10T23:12:04+09:00 Subject: [ruby-dev:16829] Re: if Re: BigFloat 小林です。 ----- Original Message ----- From: "Shin-ichiro HARA" Subject: [ruby-dev:16828] Re: if Re: BigFloat > で、BigDecimal はその変数の精度を自由に決めようとしているわけで、 > データの精度は問題にしない、、、と。 実は、BigDecimal.new("0.5",6)またはBigDecimal.new("0.500000") とすると 0.500000 であると認識しているのですが、(struct Real の MaxPrec)、有効利用の途中でくじけました。一応、情報としては持 っているので下の例のa.add(b,1)の1の変わりに a か b の MaxPrecの小さい方を使うという案もあるのですが、色々と... > つまり 0.1 + 0.1000000000001 を 0.2000000000001 と計算しても小数部 > 分の 000000000001 は明らかに不用なんで、0.2 で必要十分です。という > か、0.2 の方が情報が残っていて、0.2000000000001の方が「情報落ち」し > てると考えられますね。Mathematica 方式は実務的な技術計算上は合理的 > で効率もいいと思います。(もちろん 0.1000000000000 + 0.1000000000001 > は 0.2000000000001 です。) 明示的に require "bigdecimal" a = BigDecimal.new("0.1") b = BigDecimal.new("0.1000000000001") c = a + b # => 0.2000000000001000E0 d = a.add(b,1) # => 0.2000E0 ということでお茶を濁しています。 > あれ、Floatって有理数への変換は分母が2べきの有理数になるので > 「変換誤差」はありませんよね。そういう意味では BigDecimalと一 > 緒では。誤差があるのは、Float のリテラル表現と、内部表現の間の > 誤差、いわば Float -> Float の問題ですよね。これは BigDecimal > にはない。しかし、表記の問題は数システムの問題とは別ではないか > な。 うーん、2進内部表現のビット幅や指数部がわかれば Ratinal.new(a1*2**0+a2*2**1+a3*2**2+..., 2**n) と出来なくはないと思いますが... > 有理数は理論的な値を表現する習慣であること、有理数はかなり > 「重い」オブジェクトなので、自動的な有理数への変換には抵抗 「自動的な」という部分に関しては異論はありません。 さらに、「敢えて変換する」ならばという前提付きですね。 > があること、が主な理由です。これを美的センスの問題とは言い > たくない(が、そうかもしれない)。 ;;;(^^) > さあて、どうするのがいいですかね。 取り合えず BigDecimal#to_r を提供([ruby-dev:16789]) して、後はユーザ任せじゃダメでしょうか? ------------------ 小林 茂雄 shigeo@tinyforest.jp