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.