何时在java中使用expm1而不是exp

Mas*_*_mj 6 java double-precision exp

我对在java中使用expm1函数感到困惑Math.expm1的Oracle java doc说:

返回exp(x)-1.注意,对于接近0的x的值,expm1(x)+ 1的精确和更接近ex的真实结果而不是exp(x).

但是这个页面说:

但是,对于x的负值,大约为-4和更低,用于计算Math.exp()的算法相对不良,并且会受到舍入误差的影响.使用不同的算法计算ex - 1然后在最终结果中加1是更准确的.

我们应该使用expm1(x)表示负x值还是接近0值?

Lou*_*man 9

double位级别的实现意味着您可以将doubles 存储在0附近,其精度比doubles近1 更高.这就是为什么expm1可以为近零功率提供比精度更高的精度exp,因为double没有足够的精度来存储准确的数字非常接近1.

我不相信你引用的文章是正确的,只要准确性Math.exp(模数的限制double).该Math.exp规范保证结果内的确切值,这意味着1 ULP -过于简单化位-至多2 ^ -52,杂交的相对误差.


Mys*_*ial 5

您可以使用expm1(x)接近0的任何值.正面或负面.

原因是因为exp(x)接近0的任何东西都会非常接近1.因此exp(x) - 1x接近0 时会遭受破坏性消除.

expm1(x) 经过适当优化,以避免这种破坏性的取消.


从数学方面来说:如果exp使用其泰勒级数实现,那么expm1(x)可以通过简单地省略第一个来完成+1.