# Logarithm Benchmark

# Logarithm algorithms

## wiki method

### stats

*tokens*:46

### description

the wiki method uses an interesting property of logarithms to compute a value. specifically:

*log(A * B) = log(A) + log(B)*

by using a look up table for all the logarithms (base 10 of course) of the first 9 digits (1-9) we can use the following code to compute logarithms:

log10_table = { 0, 0.3, 0.475, 0.6, 0.7, 0.775, 0.8375, 0.9, 0.95, 1 } function log10(n) if (n < 1) return nil local t = 0 while n > 10 do n /= 10 t += 1 end return log10_table[flr(n)] + t end |

what this algorithm actually does is repeatedly divide by 10 and add the number of times it does this to a counter. Essentially we are assuming the number *n* can be expressed as *m * 10 *10 *10...* and we are simply removing these tens. then re-adding them in at the end.

## extended wiki method

### stats

*tokens*:98 (can probably be improved easily)

### description

its the same thing but we use the following properties to extend the domain of the function:

*log base n of m = log base 10 of n / log base 10 of m*

*log(n)=log(A)-log(A/n)* when 0 < n < 1

## my method

### stats

*tokens*:118

### description

I simply test 'all' the possible digits and calculate the error. then take the digit with the lowest error then I move on to test the next digit. Effectivly a brute force method.

The code:

function log(n,m) assert(n>0and m>0and m!=1) if(m<1)return log(n,10)/log(m,10) if(n<1)return -log(1/n,m) local g,cur,err='0000.0000',g,9999 for i=1,9do if i!=5then for j=0,9do cur=sub(g,1,i-1)..j..sub(g,i+1) local c=m^tonum(cur)-n if abs(c)< err and c<=0then g,err=cur,abs(c) end end end end return tonum(g) end |

[Please log in to post a comment]