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?
The implementation of double
at the bit level means that you can store double
s near 0 with much more precision than double
s 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.