6

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

返回 exp(x) -1。请注意,对于接近 0 的 x 值,expm1(x) + 1 的精确总和比 exp(x) 更接近 ex 的真实结果。

但是这个页面说:

但是,对于 x 的负值,大约为 -4 或更低,用于计算 Math.exp() 的算法表现相对较差,并且会出现舍入误差。用不同的算法计算 ex - 1 然后在最终结果上加 1 会更准确。

我们应该将 expm1(x) 用于负 x 值还是接近 0 值?

4

2 回答 2

10

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

我不相信您引用的文章是正确的,就 go 的准确性Math.exp而言(以 的限制为模double)。Math.exp规范保证结果在精确值的 1 ulp 范围内,这意味着 - 过度简化一点 - 相对误差最多为 2^-52,ish 。

于 2012-08-17T19:38:19.197 回答
6

expm1(x)用于任何接近 0 的值。正或负。

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

expm1(x)被适当优化以避免这种破坏性的取消。


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

于 2012-08-17T19:37:17.367 回答