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

时间:2012-08-17 19:33:51

标签: java double-precision exp

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

  

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

this page说:

  

然而,对于x的负值,大致为-4和更低,算法   用于计算Math.exp()是相对不良的并且受制于   舍入错误。使用a计算ex - 1更准确   不同的算法然后在最终结果中加1。

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

2 个答案:

答案 0 :(得分:9)

在位级别double的实现意味着您可以将double存储在0附近,其精度比double附近的expm1更接近1.这就是为什么exp可以因为double没有足够的精度来存储非常接近1的非常准确的数字,所以对于接近于零的幂而言,比Math.exp更准确。

我认为你所引用的文章是正确的,只要double的准确性为(模Math.exp的限制)。 {{1}}规范保证结果在精确值的1 ulp范围内,这意味着 - 过度简化一点 - 相对误差最多为2 ^ -52,ish。

答案 1 :(得分:5)

您可以将expm1(x)用于接近0的任何内容。正面或负面。

原因是因为exp(x)接近0的任何值都非常接近1.因此当exp(x) - 1接近0时,x将遭受破坏性取消。

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


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