  | 
   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.99999999999e-1 
# 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.
 
 
 |