1

这不是一个问题。我想介绍 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)

不是很明显的是,如果要检查一个结构中的所有>, <,则必须在其他两个测试之前进行相等性测试。由于 要么或可以不可预测地变成 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"

我希望这将有所帮助。

亲切的问候,卢卡

4

3 回答 3

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.

于 2013-01-19T12:45:43.063 回答
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是 TRUE 也就不足为奇了。

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

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')
}
于 2013-01-19T10:32:38.613 回答
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')
}
于 2013-01-19T15:05:17.253 回答