【问题标题】:Why (e^x-1)/x does not work properly, but (e^x-1)/log(e^x) does?为什么 (e^x-1)/x 不能正常工作,但 (e^x-1)/log(e^x) 可以?
【发布时间】:2016-01-16 05:20:57
【问题描述】:

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

【问题讨论】:

  • 你试过(e^(x-1))/x吗?
  • 但是公式应该和写的完全一样 (e^(x)-1)/x
  • 您可能会在浮点 log(e^x) != x 中看到,因此计算是不同的。尝试打印出每一个操作。
  • 这不只是抱怨使用精度有限的浮点数的局限性。有些包支持更高的精度。
  • @GmloMalo OP问题中的log 实际上是自然(以e为底)对数。在数学中它写为ln,但在编程语言中几乎总是写为log。 (尽管 log 在数学中通常被认为是以 10 为底的对数...)

标签: r floating-point computation rounding-error


【解决方案1】:

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

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

表达式 (ex − 1) / x 无法在浮点运算中对给定的 x ≈ 0 进行准确计算,而表达式 (y − 1) / log y 可以准确地评估给定的 y ≈ 1。由于这些函数在 x = 0 (y = 1) 附近缓慢变化,因此计算 (y − 1) / log y 与 y = ex ≈ 1 的准确近似(如果不准确)会产生准确的结果。

【讨论】:

  • 这个例子归功于卡汉,他用它来说明他所谓的反定理:一个被广泛相信和广泛教授但错误的定理。 William M. Kahan,“提议的 IEEE 浮点算术标准中的区间算术选项”。载于:Karl L. E. Nickel 编辑,1980 年区间数学,学术出版社 1980 年,第 99-128 页。请参阅第 110 页的“反定理 1”。
【解决方案2】:

既然这是一个 R 问题,那么通过调用 expm1(x) 来计算 exp(x)-1 怎么样? expm1() 是一个 R 函数,旨在返回准确的 exp(x)-1 值,即使 x 的值接近 0。expm1(x)/x 为您提供正确的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2011-10-22
    • 2021-02-03
    • 2018-02-19
    相关资源
    最近更新 更多