R 由于方程式和浮点数的重新排序导致输出不一致

R 由于方程式和浮点数的重新排序导致输出不一致,r,R,输出: c = .1 e = .3 (200 - 100) / (200 - 100) * (e - c) + c == .3 (e - c) * (200 - 100) / (200 - 100) + c == .3 但是: 输出: c = .1 e = .3 (200 - 100) / (200 - 100) * (e - c) + c == .3 (e - c) * (200 - 100) / (200 - 100) + c == .3 为什么重新排序会改变输出 这个问题与

输出:

c = .1
e = .3


(200 - 100) / (200 - 100) * (e - c) + c == .3
(e - c) * (200 - 100) / (200 - 100) + c == .3
但是:

输出:

c = .1
e = .3


(200 - 100) / (200 - 100) * (e - c) + c == .3
(e - c) * (200 - 100) / (200 - 100) + c == .3
为什么重新排序会改变输出

这个问题与运算的代数顺序无关,因为两个左手表达式在理论上会给出相同的结果


我怀疑可能是编译优化导致了结果的差异

在第一个等式中,两个c都只是抵消掉,而没有实际在(e-c)部分中进行运算


而在第二个等式中,必须计算(e-c)中的算术运算,因此计算机必须计算.3-.1,这导致了不精确的错误。

我真的不知道发生了什么。当然,浮动是显而易见的,但我不明白为什么像这样重新排列等式会改变事情。我用一个稍微简化的公式进行了实验,改变了数值,移动了物体

等式1和等式2与OPs相同,由于操作员偏好,等式3相当于等式1(见
?语法
)<代码>*
/
+
-
之前求值,不同的是它们是从左到右求值的,括号是从内到外解析的。因此,在等式1和等式3中,顺序是
-
/
*
+
,在等式2中,顺序是
-
*
+

[1] FALSE

我真的不知道发生了什么事。当然,浮动是显而易见的,但我不明白为什么像这样重新排列等式会改变事情。我用一个稍微简化的公式进行了实验,改变了数值,移动了物体

等式1和等式2与OPs相同,由于操作员偏好,等式3相当于等式1(见
?语法
)<代码>*
/
+
-
之前求值,不同的是它们是从左到右求值的,括号是从内到外解析的。因此,在等式1和等式3中,顺序是
-
/
*
+
,在等式2中,顺序是
-
*
+

[1] FALSE

a将@AkselA的示例再进一步,为了简单起见,删除了
+c

a <- 100
b <- 100
c <- 0.1
e <- 0.3

r1 <- a / b * (e - c) + c    # [1]

r2 <- (e - c) * a / b + c    # [2]

r3 <- (e - c) * (a / b) + c  # [3]

r1 == r2  # FALSE

r1 == r3  # TRUE

sprintf("%.20f", c(r1, r2, r3))
# "0.29999999999999998890" "0.30000000000000004441" "0.29999999999999998890"

r1将@AkselA的示例再进一步,为了简单起见,删除了
+c

a <- 100
b <- 100
c <- 0.1
e <- 0.3

r1 <- a / b * (e - c) + c    # [1]

r2 <- (e - c) * a / b + c    # [2]

r3 <- (e - c) * (a / b) + c  # [3]

r1 == r2  # FALSE

r1 == r3  # TRUE

sprintf("%.20f", c(r1, r2, r3))
# "0.29999999999999998890" "0.30000000000000004441" "0.29999999999999998890"

r1@markus:OPs问题似乎与浮点运算无关。正如RLave所写,这与操作顺序/运算符优先级有关。“我怀疑可能是编译优化导致了结果的差异。”我对此表示怀疑。在浮点运算中,运算顺序很重要,即使在数学上是等价的。为了清楚起见,我认为您需要讨论浮点运算和运算顺序来解释这种行为,我找不到合适的复制目标。@AkselA我投票重新打开,以便考虑所有方面。问题是
e
c
很可能分别不完全等于
0.3
0.1
,如果显示足够的小数,这一点就很明显了。@markus:OPs问题似乎与浮点运算无关。正如RLave所写,这与操作顺序/运算符优先级有关。“我怀疑可能是编译优化导致了结果的差异。”我对此表示怀疑。在浮点运算中,运算顺序很重要,即使在数学上是等价的。为了清楚起见,我认为您需要讨论浮点运算和运算顺序来解释这种行为,我找不到合适的复制目标。@AkselA我投票重新打开,以便考虑所有方面。问题是
e
c
很可能不完全分别等于
0.3
0.1
,如果显示足够的小数,这一点就很明显了。在本例中,您不需要
+c
。不,但我想表示四个主要运算符,它与OPs关于它被“取消”(它不是)的注释有关。在这个例子中,你不需要
+c
。不,但我想表示四个主要运算符,它与OPs关于它被“取消”(它不是)的注释有关。浮点算术不是关联的。浮点运算是不关联的。浮点运算是不关联的。浮点运算是不关联的。浮点算术不是关联的。。。浮点运算是不关联的。浮点运算是不关联的。浮点运算是不关联的。浮点运算是不关联的。浮点算术不是关联的。。。