[comp.dsp] Looking for a fast exp

scott@walt.disney.com (Scott Watson) (11/02/90)

Hi y'all -

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                   scott@walt.disney.com
#ifdef SANE
#include <std_disclaimer.h>
#endif

-- 
Scott Watson / Walt Disney Imagineering                   scott@walt.disney.com
#ifdef SANE
#include <std_disclaimer.h>
#endif

craig@netcom.UUCP (Craig Hansen) (11/02/90)

In article <1990Nov1.184820.5796@walt.disney.com>, scott@walt.disney.com (Scott Watson) writes:
> I have a need for an fast exp(x) function...
> Any ideas?

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
craig@microunity.com

mcmahan@netcom.UUCP (Dave Mc Mahan) (11/02/90)

 In a previous article, scott@walt.disney.com (Scott Watson) writes:
>Hi y'all -
>
>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... 

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                   scott@walt.disney.com

   -dave

-- 
Dave McMahan                            mcmahan@netcom.uucp
					{apple,amdahl,claris}!netcom!mcmahan

turk@Apple.COM (Ken Turkowski) (11/02/90)

In a previous article, scott@walt.disney.com (Scott Watson) writes:
>>Hi y'all -
>>
>>I have a need for an fast exp(x) function...
>>
>>x is a float and can range inside +-10.0.

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: turk@apple.com
Applelink: TURK
UUCP: sun!apple!turk

ksarkies@augean.ua.OZ.AU (Ken W. Sarkies) (11/05/90)

In article <1990Nov1.184820.5796@walt.disney.com> scott@walt.disney.com (Scott Watson) writes:
>
>I have a need for an fast exp(x) function...
>

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.