【问题标题】:Why isn't 90 - .Machine$double.eps less than 90?为什么 90 - .Machine$double.eps 不小于 90?
【发布时间】:2019-05-08 23:08:58
【问题描述】:

我在这里对精度的理解一定是遗漏了一些东西,但我认为 R 可以表示沿网格的数字,步长为.Machine$double.eps,但情况似乎并非如此;事实上:

90 - .Machine$double.eps == 90
# [1] TRUE

这对我来说很奇怪,因为这两个数字 (1) 可以表示并且 (2) 不为零:

sprintf('%.16a', c(90, .Machine$double.eps))
# [1] "0x1.6800000000000000p+6"  "0x1.0000000000000000p-52"

差异在数值上非零的第一个位置更具暗示性:

90 - 32*.Machine$double.eps < 90
# [1] FALSE
90 - 33*.Machine$double.eps < 90
# [1] TRUE

这种结果直接指向精度问题,但我在这里的理解存在一些差距......

如果90 - .Machine$double.eps == 90,为什么我的机器上的double.eps 没有更大?

这里的结果告诉我,实际上我应该有.Machine$double.eps == 2^5 * .Machine$double.eps...

【问题讨论】:

  • @jogo 这与我在环顾四周时发现的大多数浮点问题相反。我期待.1 + .2 != .3
  • 90 的有效数字将.Machine$double.eps 移开。试试91*.Machine$double.eps - 这应该会给你带来不同。 (这显然是浮点表示的一个方面!)最终阅读了 machine.eps 的定义:它是1+eps 不是1 的最低值1
  • @jogo 那么结论是十六进制指数(见我的编辑)相距太远了吗? (我猜对于 64 位表示,它们应该在 53 以内?)
  • 浮点数的间距不均匀。称为“机器 epsilon”的量是 1 处的间距,对于 64 位浮点,它约为 2.22e-16。 90处的间距约为1.421e-14。
  • "...90 和 eps 相距太远。" 你可能想错了。与其考虑将值“发送”到某处,不如看看实际发生了什么:90 和下一个 90 以下的浮点数之间的空间是.Machine$double.eps 大小的两倍多。所以最接近90 - .Machine$double.eps 的可以表示为 64 位浮点数的数字是 90。

标签: r floating-accuracy


【解决方案1】:

这种效果被称为重要性损失 (https://en.wikipedia.org/wiki/Loss_of_significance)。 90 的有效数字将.Machine$double.eps 移开。试试看

(90 - 46*.Machine$double.eps) == 90

这应该给你FALSE
machine.eps 的定义:它是eps 的最小值,1+eps 不是1

根据经验(假设以 2 为底的浮点表示):
这个eps 对范围 1 .. 2 产生了影响,
对于范围 2 .. 4,精度为 2*eps
等等。

x <- 3.8
(x + 2*.Machine$double.eps) == x
x <- 4
(x + 2*.Machine$double.eps) == x
# ...
x <- 63
(x + 32*.Machine$double.eps) == x
x <- 64
(x + 32*.Machine$double.eps) == x

浮点表示的绝对精度随x 而变化,但相对精度在浮点数范围内几乎是恒定的。

【讨论】:

  • 我会编辑这个答案,因为我在我的问题中提到了确切的k,其中(90 - k*.Machine$double.eps) == 90 切换到FALSE(并且我提出的界限更严格)。鉴于我的问题,答案非常简单——看看我提供的%.16a 输出。 p+6 距离 p-52 太远。为了检测到非零差异,我们必须将后者增加到 p-47 以上(即 p-46
  • 您的评论实际上很有帮助!但我认为这个答案并不自然地遵循所问的问题......
  • 不,这是我的问题的标题。我的问题是{body of question}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
相关资源
最近更新 更多