MATLAB中的浮点误差 - 线性间隔矢量

时间:2015-04-26 18:58:49

标签: matlab vector decimal-point significant-digits

操作系统:赢得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)也会返回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产生精确值?

谢谢大家的帮助。

1 个答案:

答案 0 :(得分:3)

首先,阅读有关浮点值的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都以双精度浮点表示为CLOSEST可能值,差值称为"浮点错误"。

观察错误很简单:

>> 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