1

操作系统: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)还返回一个Empty matrix: 1-by-0

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

1-首先为什么会这样?

2-Second 我们是否能够在 Matlab 中看到一个数字的整个值,如果可以,它的功能或设置是什么?

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

3-有没有更好的方法来命令 Matlab 产生精确值?

感谢大家的帮助。

4

1 回答 1

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都以双精度浮点数表示为最接近的可能值,这种差异称为“浮点错误”。

观察错误很简单:

>> 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
于 2015-04-26T19:31:32.417 回答