我的Matlab版本是R2012a
为什么Matlab 1.1-0.2不等于0.9 !!!!!?
这太可怕了!
>> 1.1-0.2 == 0.9
ans =
Run Code Online (Sandbox Code Playgroud)0
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间距.但实际上,这不是一个全能的解决方案; 正确比较浮点是一件棘手的事情.
| 归档时间: |
|
| 查看次数: |
569 次 |
| 最近记录: |