r - 比较 R 中的浮点数
问题描述
免责声明
我不确定是在这里发布还是在简历上发布,但在阅读了简历上的主题后,我认为它R
比纯粹的统计更具体。因此,我把它贴在这里。
问题
引用自?.Machine
double.eps
最小的正浮点数x
,使得1 + x != 1
.double.base ^ ulp.digits
如果double.base
是 2 或double.rounding
0,则等于;否则为(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
,这导致我想到了这些
问题
- 如何正确比较 R 中的 2 个数字与“最大”(浮点精度)精度?
all.equal
为什么低于和高于数字的结果不同1
?- [奖励问题]:使用
.Machine$double.eps ^ .5
默认容差而不是无平方根版本的合理性是什么?是不是简单的把考试放宽了一点?
解决方案
.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
返回TRUE
或FALSE
取决于实习生存储值的差异是否大于tolerance
.
比较 R 中的 2 个数字,如果它们是实习生存储的相等使用==
。