这是一个Matlab错误吗?你有同样的问题吗?

时间:2012-12-04 09:23:35

标签: matlab

我的Matlab版本是R2012a
为什么Matlab 1.1-0.2不等于0.9 !!!!!?
这太糟糕了!

  

>> 1.1-0.2 == 0.9

     

ans =

 0

3 个答案:

答案 0 :(得分:20)

这不是Matlab问题;这是一个浮点问题。您将在C ++(或任何符合IEEE754的编程语言)中获得相同的结果:

#include <iostream>    
int main(int, char **) {
    std::cout << (1.1-0.2==0.9) << std::endl;
    return 0;
}

输出:

0

这是因为1.1和0.9 cannot be represented exactly in binary。这就像用十进制表示1/3:你必须写

0.33333333333333333333333333333333333333333333333...

并无限期地继续。但无论你继续多久,你都永远无法做到。

在浮点数中,您只能存储这么多位数,因此计算必须在某处停止。计算结果实际上是

>> 1.1-0.2
ans =
     9.000000000000001e-01

非常接近,但不太正确。

因此,在使用==比较两个浮点数之前,应该总是三思而后行;很少有==运算符可以应用而没有像您刚刚遇到的那样“奇怪”的后果。

最好使用舍入特定容差,例如

abs(1.1-0.2 - 0.9) <= eps(0.9)

其中eps是一个Matlab函数,它返回特定double值的spacing-between-doubles。但实际上,这不是一个全能的解决方案;正确比较浮点是一件棘手的事情。

答案 1 :(得分:3)

http://matlab.wikia.com/wiki/FAQ#Why_is_0.3-0.2-0.1_not_equal_to_zero_.28or_similar.29.3F

滚动到&#34;为什么0.3 - 0.2 - 0.1(或类似)不等于零?&#34;

&#34;某些浮点数无法以二进制形式精确表示....如果您要尝试比较两个浮点数,请务必使用==这样做。另一种比较方法是检查您比较的两个数字是否足够接近&#34;&#34;

答案 2 :(得分:2)

用于这些事情的好功能是从文件交换num2strexact查看正在发生的事情

num2strexact(1.1-0.2)
0.9000000000000001332267629550187848508358001708984375


num2strexact(0.9)
0.90000000000000002220446049250313080847263336181640625

你知道,他们不一样。

使用double vs. syms

时,请注意不同之处
num2strexact((1.1-0.2)-0.9)
1.1102230246251565404236316680908203125e-16


sym('(1.1-0.2)-0.9') 
1.8367099231598242312011508394098e-40