比较 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
中的工作方式有很大的误解,这让我想到了这些
问题
- 如何正确比较 R 中的 2 个数字与 "maximum"(对于浮点精度)精度?
- 为什么
all.equal
的结果对于低于和高于 1
的数字不同?
- [奖金问题]:使用
.Machine$double.eps ^ .5
作为默认公差而不是未平方根版本的合理性是什么?是不是简单的把考试放宽一点?
.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 TRUE
或 FALSE
取决于实习生存储值的差异是否大于 tolerance
.
比较 R 中的 2 个数字(如果内部存储相等)使用 ==
。
免责声明
我不确定是 post 在这里还是 CV but after having read what is on topic on CV 我认为它更 R
具体然后纯粹统计。因此,我post在这里编辑了它。
问题
引用自?.Machine
double.eps
the smallest positive floating-point numberx
such that1 + x != 1
. It equalsdouble.base ^ ulp.digits
if eitherdouble.base
is 2 ordouble.rounding
is 0; otherwise, it is(double.base ^ double.ulp.digits) / 2
. Normally2.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
中的工作方式有很大的误解,这让我想到了这些
问题
- 如何正确比较 R 中的 2 个数字与 "maximum"(对于浮点精度)精度?
- 为什么
all.equal
的结果对于低于和高于1
的数字不同? - [奖金问题]:使用
.Machine$double.eps ^ .5
作为默认公差而不是未平方根版本的合理性是什么?是不是简单的把考试放宽一点?
.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 TRUE
或 FALSE
取决于实习生存储值的差异是否大于 tolerance
.
比较 R 中的 2 个数字(如果内部存储相等)使用 ==
。