请问有人能帮忙解释一下为什么-1 + 1 ≠ 0吗?
请问有人能帮我理解为什么当我使用内置函数consum()、我自己写的函数ct()和Excel计算同一个东西时,会得到三个不同的值?
现在,我很确定答案是一个“四舍五入”的问题,但我想不出这个问题的部分原因在哪里。我的意思是,这看起来很简单。
在R中,当我生成序列'a'并运行cumsum(a)时,我没有得到期望得到的结果0。如果我尝试使用函数计算相同的值,则会得到一个不同的答案。最后,如果我尝试使用Excel计算相同的值,则会得到第三个答案。
这是我使用cumsum()得到的结果:
> a<- seq(-1, 1, by=.1)
> a
[1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3
[15] 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> cumsum(a)
[1] -1.000000e+00 -1.900000e+00 -2.700000e+00 -3.400000e+00 -4.000000e+00
[6] -4.500000e+00 -4.900000e+00 -5.200000e+00 -5.400000e+00 -5.500000e+00
[11] -5.500000e+00 -5.400000e+00 -5.200000e+00 -4.900000e+00 -4.500000e+00
[16] -4.000000e+00 -3.400000e+00 -2.700000e+00 -1.900000e+00 -1.000000e+00
[21] 1.110223e-15
我写了一个快速的函数来测试这个问题,本以为会得到相同的答案(或者是0),但实际上得到了完全不同的答案。以下是我的函数以及其结果:
ct<- function(x){
result = 0
for(i in 1:length(x)){
cat(i, ": Result = ", result, " + ", x[i], " = ", result + x[i], "\n")
result = result + x[i]
}
}
> ct(a)
1 : Result = 0 + -1 = -1
2 : Result = -1 + -0.9 = -1.9
3 : Result = -1.9 + -0.8 = -2.7
4 : Result = -2.7 + -0.7 = -3.4
5 : Result = -3.4 + -0.6 = -4
6 : Result = -4 + -0.5 = -4.5
7 : Result = -4.5 + -0.4 = -4.9
8 : Result = -4.9 + -0.3 = -5.2
9 : Result = -5.2 + -0.2 = -5.4
10 : Result = -5.4 + -0.1 = -5.5
11 : Result = -5.5 + 0 = -5.5
12 : Result = -5.5 + 0.1 = -5.4
13 : Result = -5.4 + 0.2 = -5.2
14 : Result = -5.2 + 0.3 = -4.9
15 : Result = -4.9 + 0.4 = -4.5
16 : Result = -4.5 + 0.5 = -4
17 : Result = -4 + 0.6 = -3.4
18 : Result = -3.4 + 0.7 = -2.7
19 : Result = -2.7 + 0.8 = -1.9
20 : Result = -1.9 + 0.9 = -1
21 : Result = -1 + 1 = 4.440892e-16
如果我将for循环中的最后一行更改为以下内容,则可以得到预期的答案0:
result = round(result + x[I], digits = 2)
在Excel中,使用与我的ct()函数相同的逻辑,我得到了最终结果为-2.886580E-15(未对值进行四舍五入)。
ct(a)
与cumsum(a)
不会给出相同的答案,因为它们执行的是相同的操作(不是吗?)。 - dave(A+B)+(C+D)
,可能会对(A+B)
进行四舍五入,也可能对(C+D)
进行四舍五入,或者两者都进行四舍五入,或者两者都不进行四舍五入,这取决于浮点寄存器的可用性以及在代码开始时哪些变量的组合已经在寄存器中。 - David Schwartz