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

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

>> 1.1-0.2 == 0.9

ans =

0 

这不是一个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 不能完全用二进制表示 。 就像用十进制表示1/3一样,你必须写

 0.33333333333333333333333333333333333333333333333... 

并无限期地继续下去。 但是不pipe你持续多久,你永远不会做对。

在浮点数中,只能存储很多数字,所以计算将不得不停止。 计算的结果实际上是

 >> 1.1-0.2 ans = 9.000000000000001e-01 

这是非常接近,但不完全正确。

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

使用舍入特定容差比较好

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

其中eps是一个Matlab函数,它返回特定双精度值的double -spacing-between- double。 但实际上,这不是一个万能的解决scheme。 正确地比较浮点是一件棘手的事情。

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

滚动到“为什么0.3 – 0.2 – 0.1(或类似)不等于零?

“一些浮点数不能完全用二进制forms表示….如果你想比较两个浮点数,要非常小心地使用==这样做。另一种比较方法是检查你正在比较的两个数字“足够接近”“

使用这些东西来看看发生了什么的一个很好的函数是来自文件交换的num2strexact

 num2strexact(1.1-0.2) 0.9000000000000001332267629550187848508358001708984375 num2strexact(0.9) 0.90000000000000002220446049250313080847263336181640625 

你看,他们是不一样的。

看看使用double和syms时的不同之处

 num2strexact((1.1-0.2)-0.9) 1.1102230246251565404236316680908203125e-16 sym('(1.1-0.2)-0.9') 1.8367099231598242312011508394098e-40