正木です。

|[ruby-math:00794] Re: Rational#to_f
|From: keiju / rational.com (石塚圭樹)
|
|正木さんのをRational#to_fに正式採用しようと思っていますが, 1つ質問


やはり機種依存の code はまづいので、石塚さんの code を少し書き直した

class Rational
  def to_f
    m=128    # m > 52 for intel x86
    e = m - abs.log2floor
    Math.ldexp((self*2**e).floor.to_f,-e)
  end
end

は如何でしょう。
m を充分大きく選んでおけば他の機種でも動くだろうという考えですが、
それがどれくらいかは一寸わかりません。
ここでは一応 128 にしてありますが適当に変えてください。

intel x86 の bug(仕様)については

(a) どうせ Float なんだからと思って気にしない。
(b) 気になる場合は Bignum#to_f の再定義で対処する。

(自分で問題にしておいて何だといわれそうですが)
私自身は (a) が一番健全な態度かもしれないという考えに傾きつつあります。