正木です。 |[ruby-math:00792] Re: Rational#to_f | |これは Math.ldexp に渡す値が必要(53 bit)以上の精度を持つせいと思われます。 これは勘違いでした。 石塚さんの code を見直してみると to_f してから渡していますので、原因は Bignum#to_f の bug です。 ((2**76).div(2731)).to_f =>27666738823110336512.0 正しくは class Bignum def to_f n=abs.log2floor - 52 if n < 0 Math.ldexp(self,0) else Math.ldexp((self*2+2**n) >> n+1,n) end end end ((2**76).div(2731)).to_f =>27666738823110332416.0 それから Fixnum に対する log2floor ですが次のようにした方が無駄がない かも知れません。 def log2floor raise "not defined for self <= 0" if self <= 0 m=32 case self when Integer return 0 if self==1 return m - (1..m).find{|i| self[m-i]==1} if size==4 # return (0..m-1).collect{|i| self[i]}.rindex(1) if size==4 # return self.div(2).log2floor + 1 if size==4 self.div(2**(8*(size-4))).log2floor + 8*(size-4) when Rational return floor.log2floor if self >= 1 m=(1/self).floor.log2floor + 1 (self*2**m).floor.log2floor - m when Float Math.frexp(self)[1]-1 end end # Integer に対する log2floor (名前はもっと適切な言葉に変えた方が良いと # 思いますが)を標準で用意するというのは如何でしょうか。 ところで [ruby-math:00773] Rational#to_f で質問した Rational#to_i の件はどうなっていますか?