まつもと ゆきひろです
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になります。まあ、単に
計算速度の違いで気にすることはないのかもしれませんが。