
Little Math Trick
Submitted by 
For what its worth here's a cool little thing I 'discovered' recently.
We all know that loops take up most of program execution. Reducing time in loops
can go a long way in optimizing your code. In the spirit of optimizing loop
times I'll point your attention to a situation where you are multiplying an
accumulator by a constant value (a geometric sequence for you math guys).
Generally you would do this:
float result, r;
int i;
result = 3.0f;
r = 2.0f;
for (i=0; i<SOME_VALUE; i++)
result *= r; 
Thats spectacular, but isn't addition faster?
Why yes, but how can we add if we're multiplying?
Like this:
float result, r;
int i;
result = log(3.0f);
r = log(2.0f);
for (i=0; i<SOME_VALUE; i++)
result += r;
result = exp(result); 
Now we're adding instead of multipying!
I've tested this, and it works. You introduce error into the result, but any
floating point op on a computer does that. Here are my results from a little
test proggie I wrote:
Start conditions:
Initial value: 1.000000e+064
Multiplier: 9.99999999999e1
# Reps: 1000000000
Without optimization:
Result: 9.990005e+063
Time: 10144
Result: 9.990057e+063
With optimization:
Result: 9.990057e+063
Time: 6059
Percent error: 0.000005
Performance increase: 1.674204
Not bad. If you have multiple geometric sequences in a single loop your savings
are doubled. Of course if you're doing a small number of repetitions then the
cost of using two log()'s and an exp() probably won't make it worth the trouble,
but for larger, tight loops it can give you a significant speed boost.
Mike Reid aka "Leon Rauis" aka "Promiscuous Robot"

The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
