我的Matlab版本是R2012a
为什么Matlab 1.1-0.2不等于0.9 !!!!!?
这太糟糕了!
>> 1.1-0.2 == 0.9
ans =
0
答案 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