1

**Math and Science / Padé Expansions For Approximating the Exponential Function**

« **on:**August 01, 2017, 08:57:17 pm »

Sorry, I'm on my phone so I'll probably not go too in-depth on this Bug me for details if I don't get around to it and you need them

So:

Given ##x\in[-.5ln2,.5ln2]##

Let ##y=x^{2}##

Let ##a=\frac{x}{2}\frac{1+\frac{5y}{156}\left(1+\frac{3y}{550}\left(1+\frac{y}{1512}\right)\right)}{1+\frac{3y}{26}\left(1+\frac{5y}{396}\left(1+\frac{y}{450}\right)\right)}##

Then ##e^{x}\approx\frac{1+a}{1-a}##

Accuracy is ~75.9666 bits.

7 increments, 1 decrement

6 constant multiplications

6 general multiplications

2 general divisions

1 div by 2 (right shift or decrement an exponent)

For comparison, that's comparable to 16 terms of the Taylor's series, or 8 terms of the standard Padé expansion (exponential is special in that it comes out to f(x)/f(-x) so it can be done even easier than most).

I basically carried out a Padé expansion for e^x to infinity, noticed that after the constant term all the even coefficients were zero, so I used a Padé expansion on

In my usage, I actually implemented a 2

I think when I calculated max error using my floats it was accurate up to the last two bits or something. Don't quote me on that as I don't have those notes on me at the moment and it was done months ago.

So:

Given ##x\in[-.5ln2,.5ln2]##

Let ##y=x^{2}##

Let ##a=\frac{x}{2}\frac{1+\frac{5y}{156}\left(1+\frac{3y}{550}\left(1+\frac{y}{1512}\right)\right)}{1+\frac{3y}{26}\left(1+\frac{5y}{396}\left(1+\frac{y}{450}\right)\right)}##

Then ##e^{x}\approx\frac{1+a}{1-a}##

Accuracy is ~75.9666 bits.

7 increments, 1 decrement

6 constant multiplications

6 general multiplications

2 general divisions

1 div by 2 (right shift or decrement an exponent)

For comparison, that's comparable to 16 terms of the Taylor's series, or 8 terms of the standard Padé expansion (exponential is special in that it comes out to f(x)/f(-x) so it can be done even easier than most).

I basically carried out a Padé expansion for e^x to infinity, noticed that after the constant term all the even coefficients were zero, so I used a Padé expansion on

*that*function to quickly find our approximation for*.*`a`In my usage, I actually implemented a 2

^{x}function since I'm using binary floats with 64-bit precision. I take int(x) and save that for a final exponent for the float. Remove that value from x. By definition of int(), x is now non-negative. If x≥.5, increment that saved exponent, subtract 1 from x. Now x is on [-.5,.5]. Now we need to perform 2^{x}, but that is equivalent to e^{x*ln(2)}. We've effectively applied range reduction to our original input and now we can rely on the algorithm at the top. That integer part that we saved earlier now gets added to the exponent byte, et voilà !I think when I calculated max error using my floats it was accurate up to the last two bits or something. Don't quote me on that as I don't have those notes on me at the moment and it was done months ago.