我无法在MATLAB命令窗口中总结3个双数,这是我的变量
>> a = 0.45;
>> b = 0.05;
>> c = -0.5;
当我这样总结时,我得到 1.3878e-17
>> c + a + b
ans =
1.3878e-17
但是当我使用括号时,它会返回 0
>> c + (a + b)
ans =
0
按此顺序对它们求和也会再次返回 0
>> a + b + c
ans =
0
答案 0 :(得分:1)
通常使用IEEE 754在编程语言中存储浮点数。因此,对于某些浮点数的存储,这些浮点数无法通过某些2^i
的总和显示,会出现一些错误(在基数2中),例如0.3。
如评论中所述,您可以使用数字来查找这些错误:
digits(100);
vpa(a)
>> 0.4500000000000000111022302462515654042363166809082031250000000000000000000000000000000000000000000000
vpa(b)
>> 0.05000000000000000277555756156289135105907917022705078125000000000000000000000000000000000000000000000
vpa(c)
>> -0.5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
vpa(a+b)
>> 0.5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
vpa(c+a)
>> -0.04999999999999998889776975374843459576368331909179687500000000000000000000000000000000000000000000000
正如您在上面所看到的,由于此错误,a
和c
的总和并不像您预期的那样(因为基数2中浮点的存储错误)在IEEE 754中)。
因此,通过这些表达式找到+
的顺序非常重要。因此,加号的偏好是从左到右,并且括号的偏好高于加号,在c + (a + b)
和a + b + c
中,首先完成a + b
。然后,您可以看到上面的总和是精确的。但是,在c + a + b
中,c + a
更早发生,您可以看到此总和不准确,因此与b
之和的结果可能会有一些错误。
通过这种方式,您可以找到a + c + b
并不完全符合您的要求。和
vpa(c + b)
>> -0.4500000000000000111022302462515654042363166809082031250000000000000000000000000000000000000000000000
所以,
c + b + a
>> 0