From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2007-05-02T11:11:47+09:00 Subject: [ruby-dev:30746] Re: 大きな数の大まかな割り算 けいじゅ@いしつかです. 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 <<---