正木です。

|[ruby-math:00792] Re: Rational#to_f
|
|これは Math.ldexp に渡す値が必要(53 bit)以上の精度を持つせいと思われます。

これは勘違いでした。
石塚さんの code を見直してみると to_f してから渡していますので、原因は
Bignum#to_f の bug です。

((2**76).div(2731)).to_f =>27666738823110336512.0

正しくは

class Bignum
  def to_f
    n=abs.log2floor - 52
    if n < 0
      Math.ldexp(self,0)
    else
      Math.ldexp((self*2+2**n) >> n+1,n)
    end
  end
end

((2**76).div(2731)).to_f =>27666738823110332416.0

それから Fixnum に対する log2floor ですが次のようにした方が無駄がない
かも知れません。

  def log2floor
    raise "not defined for self <= 0" if self <= 0
    m=32
    case self
    when Integer
      return 0 if self==1
      return m - (1..m).find{|i| self[m-i]==1} if size==4
#     return (0..m-1).collect{|i| self[i]}.rindex(1) if size==4
#     return self.div(2).log2floor + 1 if size==4
      self.div(2**(8*(size-4))).log2floor + 8*(size-4)
    when Rational
      return floor.log2floor if self >= 1
      m=(1/self).floor.log2floor + 1
      (self*2**m).floor.log2floor - m
    when Float
      Math.frexp(self)[1]-1
    end
  end

# Integer に対する log2floor (名前はもっと適切な言葉に変えた方が良いと
# 思いますが)を標準で用意するというのは如何でしょうか。

ところで
[ruby-math:00773] Rational#to_f
で質問した Rational#to_i の件はどうなっていますか?