R all.equal为具有相同绝对差的两个比较提供不同的输出

wztqucjr  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(72)

我想用all.equal函数比较两个向量的元素。奇怪的是,这两个比较给予了不同的结果,我想知道为什么会发生这种情况。

map2(c(1,1,0.7), c(1,1,0.6), all.equal, tolerance = 0.1, scale = 1)

[[1]]
[1] TRUE

[[2]]
[1] TRUE

[[3]]
[1] TRUE


map2(c(1,1,0.7), c(1,1,0.8), all.equal, tolerance = 0.1, scale = 1)
[[1]]
[1] TRUE

[[2]]
[1] TRUE

[[3]]
[1] "Mean absolute difference: 0.1"

由于0.7和0.8之间以及0.6和0.7之间的绝对差是相同的,我期望得到两者的T。

toiithl6

toiithl61#

这与浮点精度有关,描述为herethere

sprintf("%.54f", 0.7)
#[1] "0.699999999999999955591079014993738383054733276367187500"
sprintf("%.54f", 0.8)
#[1] "0.800000000000000044408920985006261616945266723632812500"

所以两者的差实际上是> 0.1
您可以添加一个小公差来解决这个问题。实际上.Machine$double.eps^0.5all.equal的默认公差:

map2(c(1,1,0.7), c(1,1,0.8), all.equal, tolerance = 0.1 + .Machine$double.eps^0.5, scale = 1)

[[1]]
[1] TRUE

[[2]]
[1] TRUE

[[3]]
[1] TRUE

相关问题