首页 > 解决方案 > 比较 R 中的浮点数

问题描述

免责声明

我不确定是在这里发布还是在简历上发布,但在阅读了简历上的主题后,我认为它R比纯粹的统计更具体。因此,我把它贴在这里。

问题

引用自?.Machine

double.eps
最小的正浮点数x,使得1 + x != 1. double.base ^ ulp.digits如果double.base是 2 或double.rounding0,则等于;否则为(double.base ^ double.ulp.digits) / 2。正常情况下2.220446e-16

因此,我会假设all.equal(1 + .Machine$double.eps, 1.0)返回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看起来是相对差异比例 ,所以我试图推翻这种行为,但也没有成功:

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

显然,我对浮点数的工作原理有很大的误解R,这导致我想到了这些

问题

标签: rfloating-pointprecision

解决方案


.Machine$double.eps是 1 与大于 1 的最小可表示值之间的差值。0.1 与大于 0.1 的最小可表示值.Machine$double.eps之间的差值小于 100 与大于 100 的最小可表示值之间的差值大于.Machine$double.eps。看看:检查差异是否小于机器精度的正确/标准方法是什么?.

.Machine$double.eps

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

当您进行计算时,intern sored 值将大约为:

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返回TRUEFALSE取决于实习生存储值的差异是否大于tolerance.

比较 R 中的 2 个数字,如果它们是实习生存储的相等使用==


推荐阅读