I have a need for an fast exp(x) function...
x is a float and can range inside +-10.0.
Some sort of low granularity (read: *big array*) lookup table w/
interpolation, or something...
Any ideas?
Thanks in advance
Scott Watson / Walt Disney Imagineering sc...@walt.disney.com
#ifdef SANE
#include <std_disclaimer.h>
#endif
--
Scott Watson / Walt Disney Imagineering sc...@walt.disney.com
#ifdef SANE
#include <std_disclaimer.h>
#endif
Decompose your exp(x) into exp(a+b), where a and b are
the most-significant and least significant parts of x.
exp(a+b)=exp(a)*exp(b), so get exp(a) and exp(b) from
two small tables and multiply them together.
Regards,
Craig Hansen
cr...@microunity.com
How much accuracy do you need, and how fast does it have to be? Also, what
kind of CPU are you using and how much memory can you dedicate to a lookup
table?
>Scott Watson / Walt Disney Imagineering sc...@walt.disney.com
-dave
--
Dave McMahan mcm...@netcom.uucp
{apple,amdahl,claris}!netcom!mcmahan
You can calculate exp(x) in fixed-point with a series of shifts
and adds and a small lookup table using CORDIC iterations.
Convergence is linear, so you get about one bit of precision with
each iteration through a simple loop. With 32-bit words, you can
probably get 26 bits of precision. If you can get by with less
bits of precision, you can by with less iterations.
I don't have the references handy, but I just recently published
a paper in Graphics Gems (Academic Press, 1990) on CORDIC trigonometry.
In the references to that paper are pointer to papers by Walthers
and Chen which address exp, log, sqrt, and a host of other nonlinear
functions.
--
Ken Turkowski @ Apple Computer, Inc., Cupertino, CA
Internet: tu...@apple.com
Applelink: TURK
UUCP: sun!apple!turk
Another idea I have used is the polynomial approximations as given in
Abramowitz and Stegun ``Handbook of Mathematical Functions''. For exp(x) you
can get accuracy to 2 x 10^{-10} for seven terms with 0<x<ln(2). Outside that
range use known results i.e. exp(x) = 2 x exp(x - ln(2)) for ln(2)<x<2ln(2).
The seven terms might be a bit much if you want real speed, but with other
suggestions given you may be able to tailor a useful algorithm depending on
your speed/accuracy/memory tradeoff.
--
Ken Sarkies
No disclaimer. My boss takes all responsibility for my big mouth.
My standard questions: how fast do you want it, how accurate do you want it,
and how much memory are you willing to use?
Actually the exponential function is very easy to compute, because exp(x+y) =
exp(x) exp(y). So don't even need CORDIC, you can get by with one dimension.
All you need is a table of exp(2^n) for a wide range of n. For each bit
that's on in the argument, you multiply the result by the corresponding value.
If you want it to be faster and you're willing to use more memory, you can do
many bits at a time.