なかだです。

At Wed, 18 Sep 2002 05:01:12 +0900,
Masaaki Sakano wrote:
> Float を必要な精度で Rational に変換するための自作ライブラリ ---
> 具体的には Float class に .to_r(prec=5) (precは精度) メソッドを
> つけ加える --- を添付してみました。

Rationalの乗除算を繰り返してるのが気になったので、ちょっと書き
換えてみました。

> # fl2rat.rb
> class Float
>   def to_r(prec=5)
>     ## Do "include Math" and "require 'rational'" first.
> 
>     case self
>     when Integer, Rational, 0
>       return self.to_r
>     end

Floatのメソッドなので、これは要らないのでは。

>     if self < 0
>       keta=10**(log10(-self).floor)
>     else
>       keta=10**(log10(self).floor)
>     end
> 
>     keta2=10**(prec-1)
>     (keta.to_r)*((self/keta)*keta2).round/keta2
>   end
> end

class Float
  def to_r(prec = 5)
    ofs = prec - Math.log10(self.abs).floor - 1
    num = (self * 10.0 ** ofs).round
    if ofs > 0
      Rational.reduce(num, 10.power!(ofs))
    else
      Rational.new(num * 10.power!(-ofs), 1)
    end
  end
end

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦