[#30743] 大きな数の大まかな割り算 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

17 messages 2007/05/01

[#30827] Supporting Fiber — SASADA Koichi <ko1@...>

 ささだです。

22 messages 2007/05/27

[ruby-dev:30746] Re: 大きな数の大まかな割り算

From: keiju@... (石塚圭樹)
Date: 2007-05-02 02:11:47 UTC
List: ruby-dev #30746
けいじゅ@いしつかです.

In [ruby-dev:30743] the message: "[ruby-dev:30743] 大きな数の大まかな
割り算", on May/02 08:56(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです
>
>[ruby-core:11069]で報告があったのですが、rationalの分子分母
>があまりに大きいとFloatに変換できず、本来有限の値なのに結果
>がNaNになってしまうようです。

>というシンプルなものであるせいなのですが、Float(double)の範
>囲内で収まるような割り算を行うアルゴリズムをご存じの人はいま
>せんか?

私の方の版では, 

class Rational
  def to_f
    m = Float.prec_size
    e = m - abs.log2floor
    Math.ldexp((self * 2**e).floor.to_f,-e)
  end
end

class Integer
  def log2floor
    raise RangeError, "not defined for self <= 0" if self <= 0
    return 0 if self==1
    return self.div(2).log2floor + 1 if size==4
    self.div(2**(8*(size-4))).log2floor + 8*(size-4)
  end
end

となっていました.

これだと, 結果の指数部がFloatの範囲に入っていれば動作します.

ただ, Fload.prec_size がどこにあるのかわからない...

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@ishitsuka.com <<---

In This Thread