比较 R 中的浮点数

Compare floats in R

免责声明

我不确定是 post 在这里还是 CV but after having read what is on topic on CV 我认为它更 R 具体然后纯粹统计。因此,我post在这里编辑了它。

问题

引用自?.Machine

double.eps
the smallest positive floating-point number x such that 1 + x != 1. It equals double.base ^ ulp.digits if either double.base is 2 or double.rounding is 0; otherwise, it is (double.base ^ double.ulp.digits) / 2. Normally 2.220446e-16.

因此,我假设 all.equal(1 + .Machine$double.eps, 1.0) returns FALSE。它没有。阅读 all.equal 的文档,我看到默认容差是 .Machine$double.eps ^ 0.5.

很公平,但我观察到一些我不理解的奇怪结果:

isTRUE(all.equal(1.0 + .Machine$double.eps, 1.0, tolerance = .Machine$double.eps)) # TRUE
isTRUE(all.equal(1.0 - .Machine$double.eps, 1.0, tolerance = .Machine$double.eps)) # FALSE
isTRUE(all.equal(0.9 + .Machine$double.eps, 0.9, tolerance = .Machine$double.eps)) # FALSE
isTRUE(all.equal(2.0 + .Machine$double.eps, 2.0, tolerance = .Machine$double.eps)) # TRUE

因此,all.equal 只正确选择小于 1 的数字的差异。

我能想到的最后一个解释是 all.equal 默认情况下在 relative difference scale 上查看,所以我试图推翻这种行为,但也没有成功:

isTRUE(all.equal(1.0 + .Machine$double.eps, 1.0, 
                 tolerance = .Machine$double.eps, scale = 1)) # TRUE

显然,我对浮点数在 R 中的工作方式有很大的误解,这让我想到了这些

问题

.Machine$double.eps是1和大于1的最小可表示值的差,0.1和大于0.1的最小可表示值的差小于.Machine$double.eps,100和100的差大于 100 的最小可表示值大于 .Machine$double.eps。看看:.

.Machine$double.eps

.Machine$double.eps
[1] 2.220446e-16

当您进行计算时,实习生存储值约为:

print(1.0 + .Machine$double.eps, 20)
#[1] 1.000000000000000222
print(1.0 - .Machine$double.eps, 20)
#[1] 0.99999999999999977796
print(0.9 + .Machine$double.eps, 20)
#[1] 0.90000000000000024425
print(2.0 + .Machine$double.eps, 20)
#[1] 2

使用 tolerance = .Machine$double.eps all.equal returns TRUEFALSE 取决于实习生存储值的差异是否大于 tolerance.

比较 R 中的 2 个数字(如果内部存储相等)使用 ==