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

In [ruby-math:00792] the message: "[ruby-math:00792] Re:
Rational#to_f", on Dec/17 02:37(JST) masaki writes:

>正木です。
>石塚さんの 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

正木さんのをRational#to_fに正式採用しようと思っていますが, 1つ質問

  m,n = 53,1023

の 1023 はどういう意味ですか?

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