まつもと ゆきひろです

In message "[ruby-math:00795] Re: Rational#to_f"
    on 02/12/18, masaki <GEC01122 / nifty.ne.jp> writes:

|それから 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

ところで、size==4でFixnumかどうかを判定しているようですが、
64bitマシンではたぶんsizeは4ではなく8になります。まあ、単に
計算速度の違いで気にすることはないのかもしれませんが。