我对在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值?
答案 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
。