Last active
August 23, 2016 06:47
-
-
Save Madsy/22ba3725531730e31992bf86cc9967d4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
log2_integer_recur(x, integer_result, error, multiplier, level): | |
if x > multiplier: | |
x = log2_integer_recur(x, integer_result, error, multiplier*multiplier, level*2) | |
while x > multiplier: | |
x := x / multiplier | |
integer_result := integer_result + level | |
return x | |
else: | |
return x | |
log2_integer(x, integer_result, error): | |
multiplier = 2 | |
if x > 2: | |
x = log2_integer_recur(x, integer_result, error, multiplier*multiplier, 2): | |
while x > 2: | |
x := x / 2 | |
integer_result := integer_result + 1 | |
error = x | |
else: | |
error = x | |
log2(x): | |
result = 0 | |
rem = 0 | |
i = 0 | |
log2_integer(x, i, rem) ; integer exponent stored in i, the remaining error from trial division stored in rem | |
result += i ; accumulate result | |
m = truncate(rem * 2^29) ; fixedpoint base. scale rem with a huge number then truncate | |
log2_integer(m, i) ;get the integer exponent from m stored in i | |
i -= 29 ; by the identity log(x / y) = log(x) - log(y), subtract log2(2^29) from the previous iteration | |
result += i | |
return result |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment