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

ドキュメントから、同等性をブールチェックする2つの正しい方法があります。

isTRUE(all.equal(a,b))

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

すぐにはわからないのは、1つの構造><、、のすべてをチェックしたい場合は、他の2つのテストの前に同等性のテストを実行する必要があるということです。浮動小数点の数値のあいまいさのために、またはのいずれかが予期せずに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インフェルノの最初のサークルからヒントを得て、さらに数字を見る

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

a > bしたがって、Rが 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 に答える