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

Mah*_*hdi 8 matlab

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

>> 1.1-0.2 == 0.9

ans =

 0
Run Code Online (Sandbox Code Playgroud)

Rod*_*uis 20

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

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

输出:

0
Run Code Online (Sandbox Code Playgroud)

这是因为1.1和0.9 不能完全用二进制表示.这就像用十进制表示1/3:你必须写

0.33333333333333333333333333333333333333333333333...
Run Code Online (Sandbox Code Playgroud)

并且无限期地继续下去.但无论你继续多久,你都永远无法做到.

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

>> 1.1-0.2
ans =
     9.000000000000001e-01
Run Code Online (Sandbox Code Playgroud)

这是非常接近,但不太正确.

因此,在使用==比较两个浮点数之前,应该总是三思而后行; 很少有==操作员能够在没有像您刚刚遇到的那种"奇怪"后果的情况下使用.

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

abs(1.1-0.2 - 0.9) <= eps(0.9)
Run Code Online (Sandbox Code Playgroud)

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

  • @Shai:双打之间的间距因人数而异.正确的方法是使用'eps(0.9)`进行比较.也许这就是你的意思,但是哦. (2认同)
  • @Shai:前几天我学到了有趣的事实:**IEEE754双精度中所有可表示值的一半**位于区间(-1 1) (2认同)