matlab双重比较

use*_*001 6 double comparison matlab

我试图将一个双精度数组与一个标量双精度数进行比较以获得相等,但在某些情况下,平等性永远不会被识别出来.我怀疑这与双重表示的方式有关(例如,1.0 vs 1.00),但我无法弄明白.

例如,我已经生成了一个由数千个双值组成的数组,其中最后几个在某个时刻由下式给出

10.6000
-11.0000
10.2000
22.6000
3.4000
Run Code Online (Sandbox Code Playgroud)

如果我通过命令array==10.2(或array=10.2000)测试等于10.2(或10.2000 ),我返回一个0的数组.如果我手动(例如array=[10.6000 -11.0000 10.2000 22.6000 3.4000])将所显示的值放入数组中,则命令成功(即array==10.2返回0 0 1 0 0).如果我手动输入值,有人可以解释为什么相等成功,但如果在程序的上下文中生成数组则会失败?我能够通过使用近似而不是精确的比较(例如(array<10.20001) & (array>10.19999))来纠正比较失败,但这似乎不令人满意.

编辑:通过迭代加法或减法常量double(例如,0.2)生成数组中的值.因此,该阵列的模数0.2应该在任何地方都等于0.实际上,每个元素的模数等于0或者0.2,如下面数组中的上述数字序列所示:

mod(array,0.2)
...
0.2000
     0
0.2000
0.2000
     0
Run Code Online (Sandbox Code Playgroud)

同样,如果将值手动放置在数组中并且采用模数,0则获得所有s 的期望值.

gra*_*eot 6

原因是MATLAB截断数组中的数字,在显示时小数点后仅保留4位数.也就是说,你的数组的真正价值可能是[10.600000000001, -10.99999999999, ...].你是对的,这是由于计算机中浮点数的内部表示,这可能会导致计算中的微小错误.

我个人认为有两个解决方案,一个是像你一样的近似匹配,而另一个是先将数组四舍五入(例如,使用FileExchange中的这个工具),然后进行精确匹配.