けいじゅ@日本ラショナルソフトウェアです.

In [ruby-math:00809] the message: "[ruby-math:00809] Re:
Rational#to_f", on Dec/19 15:07(JST) masaki writes:

>正木です。

>|正木さんのを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 にしてありますが適当に変えてください。

以下のようなもので計算するのはいかがでしょう? 

  BASE = 2.0
  def Rational.precsize_of_float
    i = 0
    diff = 1.0
    while 1.0 != 1.0 + diff
      i += 1
      diff /= BASE
    end
    i - 1
  end
  FLOAT_PRECSIZE = Rational::precsize_of_float

>intel x86 の bug(仕様)については
>
>(a) どうせ Float なんだからと思って気にしない。
>(b) 気になる場合は Bignum#to_f の再定義で対処する。
>
>(自分で問題にしておいて何だといわれそうですが)
>私自身は (a) が一番健全な態度かもしれないという考えに傾きつつあります。

私も(a)でよいと思っていますです.

PS.
ところで, 正木さんのRealってどこかアクセスできるようなところに置いてあ
るんですか? テストに使おうかと思ったのですが, 見当たらなかったもので...

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---