正木です。

|[ruby-math:00801] Re: Rational#to_f
|From: matz / ruby-lang.org (Yukihiro Matsumoto)
|
|ところで、size==4でFixnumかどうかを判定しているようですが、
|64bitマシンではたぶんsizeは4ではなく8になります。まあ、単に
|計算速度の違いで気にすることはないのかもしれませんが。


class Numeric
  def log2floor
    raise "not defined for self <= 0" if self <= 0
    s=1.size
    byte=8
    m=byte*s
    case self
    when Integer
      return 0 if self==1
      return m-(1..m).find{|i| self[m-i]==1} if size==s
      self.div(2**(byte*(size-s))).log2floor + byte*(size-s)
    when Rational
      return floor.log2floor if self >= 1
      n=(1/self).floor.log2floor + 1
      (self*2**n).floor.log2floor - n
    when Float
      Math.frexp(self)[1]-1
    end
  end
end

に変更します。

Integer に対する log2floor に相当するものが組み込みであったら
便利だと思う人はほかにはいませんか?