当我按如下方式创建矢量时:
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产生精确值?
谢谢大家的帮助。
答案 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.6
和0.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