From: Shin-ichiro HARA Date: 2002-04-11T19:32:41+09:00 Subject: [ruby-dev:16848] Re: if Re: BigFloat 原です。 >小林です。 >明示的に >require "bigdecimal" >a = BigDecimal.new("0.1") >b = BigDecimal.new("0.1000000000001") >c = a + b # => 0.2000000000001000E0 >d = a.add(b,1) # => 0.2000E0 >ということでお茶を濁しています。 実用上はこれで十分ですね。ただし BigDecimal はこういうものだ という事をもう少しマニュアルなどで宣伝しておいた方がいいでしょ う。 > > あれ、Floatって有理数への変換は分母が2べきの有理数になるので > > 「変換誤差」はありませんよね。そういう意味では BigDecimalと一 > > 緒では。誤差があるのは、Float のリテラル表現と、内部表現の間の > > 誤差、いわば Float -> Float の問題ですよね。これは BigDecimal > > にはない。しかし、表記の問題は数システムの問題とは別ではないか > > な。 >うーん、2進内部表現のビット幅や指数部がわかれば >Ratinal.new(a1*2**0+a2*2**1+a3*2**2+..., 2**n) >と出来なくはないと思いますが... あれ、C 言語では内部表現ってアクセスできないんでしょうか? (私 C 知らないんです。^^;) >取り合えず BigDecimal#to_r を提供([ruby-dev:16789]) >して、後はユーザ任せじゃダメでしょうか? これはどういう意味ですか。 BigDecimal op Rational -> BigDecimal にして、かつ BigDecimal#to_r を用意するということ? それは賛成です。