R:all.equal 与 all

cos*_*osa 3 r

我试图使用 all 和 all.equal 来测试两个向量是否相等,但它们给出了不同的结果,我不确定为什么。

> x = seq(0,1,by=0.2)
> x
[1] 0.0 0.2 0.4 0.6 0.8 1.0
 > y = c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
> all(x == y)
[1]  FALSE
> all.equal(x, y)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

Z.L*_*Lin 5

看起来您已经陷入了R hell 的第一圈,其中浮点数的行为与预期不符。

行为不当的对是 x[4] 和 y[4] (根据上面 Coffeeinjunky 的评论)。仔细看看它们:

> print(c(x[4], y[4]))
[1] 0.6 0.6
> print(c(x[4], y[4]), digits = 16)
[1] 0.6000000000000001 0.6000000000000000
Run Code Online (Sandbox Code Playgroud)

all.equal具有大约 1.5e-8 左右的默认容差级别,并且不会报告低于此阈值的差异。这就是为什么all.equal(x, y)返回 TRUE,而all(x==y)返回 FALSE。

这篇文章更详细地讨论了这个问题:R中的数值比较困难