Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

when to use expm1 instead of exp in java

I am confused about using expm1 function in java The Oracle java doc for Math.expm1 says:

Returns exp(x) -1. Note that for values of x near 0, the exact sum of expm1(x) + 1 is much closer to the true result of ex than exp(x).

but this page says:

However, for negative values of x, roughly -4 and lower, the algorithm used to calculate Math.exp() is relatively ill-behaved and subject to round-off error. It's more accurate to calculate ex - 1 with a different algorithm and then add 1 to the final result.

should we use expm1(x) for negative x values or near 0 values?

like image 919
Masood_mj Avatar asked Aug 17 '12 19:08

Masood_mj


2 Answers

The implementation of double at the bit level means that you can store doubles near 0 with much more precision than doubles near 1. That's why expm1 can give you much more accuracy for near-zero powers than exp can, because double doesn't have enough precision to store very accurate numbers very close to 1.

I don't believe the article you're citing is correct, as far as the accuracy of Math.exp goes (modulo the limitations of double). The Math.exp specification guarantees that the result is within 1 ulp of the exact value, which means -- to oversimplify a bit -- a relative error of at most 2^-52, ish.

like image 55
Louis Wasserman Avatar answered Oct 01 '22 23:10

Louis Wasserman


You use expm1(x) for anything close to 0. Positive or negative.

The reason is because exp(x) of anything close to 0 will be very close to 1. Therefore exp(x) - 1 will suffer from destructive cancellation when x is close to 0.

expm1(x) is properly optimized to avoid this destructive cancellation.


From the mathematical side: If exp is implemented using its Taylor Series, then expm1(x) can be done by simply omitting the first +1.

like image 39
Mysticial Avatar answered Oct 02 '22 01:10

Mysticial