MATLAB 中的浮点错误 - 线性间隔向量

Floating point error in MATLAB - linearly spaced vectors

OS: Win 7 64 位。 Matlab: 2014a, 2015a

当我创建一个向量时如下:

a = 0.2:0.2:1

我得到:

a = 0.2000    0.4000    0.6000    0.8000    1.0000

这是意料之中的。现在,当我想查看向量中是否存在 0.6 时,我输入:

a == 0.6

我得到:0 0 0 0 0

find(a == 0.6) 还有 return 一个 Empty matrix: 1-by-0

这些都是出乎意料的。它能够找到所有其他值,但对于 0.6 存在问题。我认为虽然创建了 0.6,但它实际上是 0.600000000000000001 或类似的东西,这是一个问题。通过a > 0.6可以看到是这样,会得到0 0 1 1 1.

1-首先为什么会这样?

2 秒我们能在 Matlab 中看到一个数字的完整值吗?如果是的话,它的功能或设置是什么?

我使用 linspace 创建了相同的矢量,但这也没有帮助。我通过键入以下内容找到了解决方案:a = roundn(a, -10)。但是,我认为一开始甚至不需要这样的解决方案。

3-是否有更好的方法让 Matlab 产生精确值?

谢谢大家的帮助。

首先,阅读有关浮点值的 MATLAB 文档,特别注意有关浮点误差和精度的部分: MATLAB Floating Point

您遇到了一个非常普遍的浮点精度问题。重要的是要认识到你实际上并不是在比较:

>> a = 0.6;
>> b = 0.6;
>> a == b
   ans = 1

相反,您实际上是在比较:

>> a = 0.6;
>> b = 0.2 + 0.2 + 0.2;
>> a == b
   ans = 0

这里明显的逻辑谬误的原因是算术实际上并不相等。值 0.60.2 均以双精度浮点数表示为最接近的可能值,差异称为 "floating point error"。

观察错误很简单:

>> a = 0.6;
>> b = 0.2 + 0.2 + 0.2;
>> a - b
   ans = -1.110223024625157e-16

最简单的解决方案是对标量和向量使用相同精度的 round(),然后执行比较:

>> a = 0.6;
>> b = [ 0.2 : 0.2 : 1 ];
>> roundn ( a , -10) == roundn ( b , -10 )
   ans = 0 0 1 0 0