【发布时间】: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