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

标签 r floating-point computation rounding-error

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

最佳答案

问题是第一个函数表现出所谓的灾难性抵消:对于 x 接近 0,ex/em> 非常接近 1 + x。由于 float 在 1 附近的密度低于 0,表达式 ex − 1 的结果将非常接近 x,但是由于中间舍入而失去准确性。

第二个利用了一个巧妙的技巧来“抵消”舍入误差。事实上,此特定示例在 section 1.14.1 中有详细介绍。 Nicholas J. Higham 的优秀著作数值算法的准确性和稳定性。他解释的关键是

The expression (ex − 1) / x cannot be accurately evaluated for a given x ≈ 0 in floating point arithmetic, while the expression (y − 1) / log y can be be accurately evaluated for a given y ≈ 1. Since these functions are slowly varying near x = 0 (y = 1), evaluating (y − 1) / log y with an accurate, if inexact, approximation to y = ex ≈ 1 produces an accurate result.

关于r - 为什么 (e^x-1)/x 不能正常工作,但 (e^x-1)/log(e^x) 可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187696/

相关文章:

c++ - 计算三角函数精度下降,误差百分比上升

r - 使用 ggplot 同时重叠折线图和条形图

r - 如何使用 R 中的 if 语句将唯一函数应用于数据集的多行?

c - Payne Hanek算法在C中的实现

c++ - 什么操作可以使 float 离开 [0, 1] 范围?

.net - 使用Orleans,如何实现分布式计算和分布式数据存储?

r - 使用 NSE 在函数中调用 ggplot

r - dplyr 变异/嬗变 : drop only the columns used in the formula

c# - C# double 的尾数归一化

matlab - 为什么 MATLAB 中的 fix((20.45-20)*60) 与 fix((20)*60) 不相等