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

标签 matlab

<分区>

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

>>1.1-0.2 == 0.9

ans =

 0

最佳答案

这不是 Matlab 问题;这是一个 float 问题。您将在 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...

并无限期地继续下去。但无论你继续多久,你永远不会把它做好。

在 float 中,您只能存储这么多数字,因此计算必须在某个地方停止。计算的结果其实是

>> 1.1-0.2
ans =
     9.000000000000001e-01

这很接近,但不太正确。

正因为如此,在使用== 比较两个 float 之前,你应该三思;很少有 == 运算符可以在没有像您刚刚遇到的那样的一些“奇怪”后果的情况下应用。

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

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

其中 eps 是一个返回 spacing-between-doubles 的 Matlab 函数对于特定的 double 值。但实际上,这不是一个包罗万象的解决方案。正确比较 float 是一件棘手的事情。

关于matlab - 这是一个 Matlab 错误吗?你有同样的问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13699596/

相关文章:

MATLAB 如何保存图像?

MATLAB:制作行移位的矩阵

python - Python 编辑器中的单元格模式

c# - 两组网格之间的快速 bool 运算

matlab - 激光雷达数据的 delaunay 三角测量输出

matlab - 使用 'datenum' 创建间隔

matlab - 使用 Simulink "Shift Arithmetic" block 抑制溢出警告

MATLAB 1/Inf 默认值?

matlab - MSER 在 MATLAB 中的完整实现

matlab - Simulink,这个 m 代码块在输入不匹配时如何工作?