正木です。


石塚さんの code 拝見しました。([ruby-math:00790] Re: Rational#to_f )
早速試してみましたが
(1/n).to_f が n=2731,4623,5462,5607,5963,6147,9246,・・・
の場合に正しい値を返しません。これらは 1.0/n が間違った値を返す n と
一致します。
これは Math.ldexp に渡す値が必要(53 bit)以上の精度を持つせいと思われます。

Math.ldexp という method があることに気づきませんでしたが、私の code
も次のように書いた方がすっきりしそうです。

class Rational
  def to_f # for intel 64 bit floating point
    m,n=52,1023
    e=abs.log2floor
    if e > m-n
      Math.ldexp((self*2**(m-e)).round,e-m)
    else
      Math.ldexp((self*2**n),-n)
    end
  end
end