请注意在if .. else if .. else中使用逻辑运算符

时间:2013-01-19 09:31:57

标签: r comparison-operators

这不是问题。我想介绍R中几乎没有记录的部分。

a <- 0.3-0.1 # should be 0.2

b <- 0.7-0.5 # should also be 0.2

但是,由于浮点表示,

a==b
[1] FALSE

从文档中,有两种正确的方法来布尔检查相等性:

isTRUE(all.equal(a,b))

identical(all.equal(a,b), TRUE)

如果想要在一个>结构中检查<==if .. else if .. else if中的所有内容,那么不能立即明显的是,那么平等的测试必须在其他两个测试之前进行。由于任何一个 由于浮点数字模糊性,a > ba < b可能无法预测为真 - 再次出现。

不受欢迎行为的示例:

if (a < b)
{
    print('a smaller than b')

} else if (a > b) {
    print('a greater than b')

} else if (isTRUE(all.equal(a,b))) {
    print('a equal b')
}

[1] "a smaller than b"

我希望这会有所帮助。

亲切的问候, 卢卡

3 个答案:

答案 0 :(得分:4)

如果我运行你的代码,我会

> [1] "a greater than b"

这并不意外。从R inferno的第一个圆圈中获取提示并查看更多数字

> print(c(a,b,a-b), digits=20)
[1] 1.9999999999999998335e-01 1.9999999999999995559e-01
[3] 2.7755575615628913511e-17

因此毫不奇怪R认为a > b是真的。

为了解决这个问题,你可以编写类似

的内容
if        (a < b & ! isTRUE(all.equal(a, b))) {
    print('a smaller than b')

} else if (a > b & ! isTRUE(all.equal(a, b))) {
    print('a greater than b')

} else if (a == b |  isTRUE(all.equal(a, b))) {
    print('a equals b')
}

答案 1 :(得分:4)

这就是OP的解决方案:

if (isTRUE(all.equal(a, b))) {
    print('a equals b')
} else if (a > b) {
    print('a greater than b')
} else if (a < b) {
   print('a smaller than b')
}

首先排除all.equal - ity,然后您可以相信<>将执行预期的操作。这样,就不需要重复使用all.equal

答案 2 :(得分:1)

或者,您可以包含阈值。

thresh <- 1e-12

if (a - b > thresh)        {
    print('a greater than b')
} else if (b - a > thresh) {
    print('a smaller than b')
} else {
    print('a equals b')
}