为什么 (e^x-1)/x 不能正常工作,但 (e^x-1)/log(e^x) 可以?

Jur*_*raj 2 floating-point r rounding-error computation

我想问一个问题,为什么对于非常接近零的数字计算 (e^x-1)/x 的值不能正常工作(例如,如果 x=10^-15,结果是 1.1102230),但是当我使用公式 (e^x-1)/log(e^x) 是数学等价的,它给了我 1.000000 的正确结果。谢谢。

Sim*_*rne 5

问题是,所谓的第一功能展品灾难性的取消:为X接近0,Ë X非常接近1 + X。由于浮点数在 1 附近的密度小于 0,因此表达式e x − 1 的结果将非常接近x,但由于中间舍入而失去准确性。

第二个利用了“消除”舍入误差的巧妙技巧。事实上,这个特殊的例子在Nicholas J. Higham 的优秀著作Accuracy and Stability of Numerical Algorithms 的1.14.1 节中有详细介绍。他解释的关键是

表达式(e x − 1) / x无法针对给定的x准确计算0在浮点运算中,而表达式(y − 1) / log y 可以准确地计算给定y ? 1 . 由于这些函数在x = 0 ( y = 1 )附近缓慢变化,因此使用准确的(如果不精确的)y = e x近似值来评估(y − 1) / log y 1产生准确的结果。