【发布时间】:2020-04-22 08:02:30
【问题描述】:
免责声明
我不确定是在这里发布还是在CV 上发布,但在阅读了is on topic on CV 的内容后,我认为它更具体是R,而不是纯粹的统计数据。因此,我把它贴在这里。
问题
引用?.Machine
double.eps
最小的正浮点数x使得1 + x != 1。如果double.base为2 或double.rounding为0,则等于double.base ^ ulp.digits;否则为(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 默认情况下会显示在 relative difference scale 上,所以我试图推翻这种行为也没有成功:
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最小正浮点数x使得1 + x != 1。对于0.1 + x != 0.1,x 小于Machine$double.eps,对于100 + x != 100,x 大于Machine$double.eps -
要将 R 中的 2 个数字与“最大”精度进行比较,请正确使用
==。 -
正如你在这里给出的
.Machine$double.eps的容差。 -
Re “[Bonus Question]:使用 .Machine$double.eps ^ .5 作为默认容差而不是无平方根版本的合理性是什么?是不是简单地把测试放宽了一点?”:唯一合理的是很多人用浮点数做简单的事情,只得到一些表现良好的舍入错误,并且不需要区分数字,如果使用实数算术计算,则非常接近但不相等。从本质上讲,这种默认容差只适用于业余爱好者在涉及复杂工作时进行修补和破坏。避免使用它。
标签: r floating-point precision