Skip to content

Instantly share code, notes, and snippets.

@Madsy
Last active August 23, 2016 06:47
Show Gist options
  • Save Madsy/22ba3725531730e31992bf86cc9967d4 to your computer and use it in GitHub Desktop.
Save Madsy/22ba3725531730e31992bf86cc9967d4 to your computer and use it in GitHub Desktop.
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