在matlab中

时间:2017-07-22 05:48:27

标签: matlab sum double

我无法在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

1 个答案:

答案 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

正如您在上面所看到的,由于此错误,ac的总和并不像您预期​​的那样(因为基数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