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关于它被“取消”(它不是)的注释有关。浮点算术不是关联的。浮点运算是不关联的。浮点运算是不关联的。浮点运算是不关联的。浮点算术不是关联的。。。浮点运算是不关联的。浮点运算是不关联的。浮点运算是不关联的。浮点运算是不关联的。浮点算术不是关联的。。。