我想问一个问题为什么(e ^ x-1)/ x对于非常接近零的数字的计算值不能正常工作(例如,如果x = 10 ^ -15,结果是1.1102230),但是当我使用公式(e ^ x-1)/ log(e ^ x)时,它是数学等价的,它给出了正确的结果1.000000。感谢。
答案 0 :(得分:4)
由于这是一个R问题,如何通过调用expm1(x)来计算exp(x)-1? expm1()是一个R函数,用于返回exp(x)-1的精确值,即使x值接近0也是如此.exp1(x)/ x给出正确的答案。
答案 1 :(得分:2)
问题是第一个函数表现出所谓的灾难性取消:对于 x 接近0, e x < / em>非常接近 1 + x 。由于浮点数在1附近密度小于0,表达式 e x - 1 的结果将非常接近 x ,但由于中间舍入而失去准确性。
第二个利用一个巧妙的技巧&#34;取消&#34;舍入误差。事实上,这个特殊的例子在Nicholas J. Higham的优秀着作数学算法的准确性和稳定性的section 1.14.1中有详细介绍。他解释的关键是
在浮点运算中,对于给定的x≈0,表达式(e x - 1)/ x 无法准确评估,而对于给定的y≈1,可以准确地评估表达式(y - 1) / log y 。由于这些函数在 x = 0 ( y = 1 )附近缓慢变化,因此评估(y - 1) / log y < / em>准确的,如果不精确的近似 y = e x ≈1会产生准确的结果。