matlab双重比较

时间:2012-01-22 06:25:33

标签: matlab comparison double

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

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

给出
10.6000
-11.0000
10.2000
22.6000
3.4000

如果我通过命令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。实际上,每个元素的模数等于00.2,如下面对数组中上面的数字序列所示:

mod(array,0.2)
...
0.2000
     0
0.2000
0.2000
     0

同样,如果将值手动放入数组并采用模数,则会获得所有0的预期值。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

某些东西可能在某个地方有单精度,在其他地方可能是双倍的。例如二进制表示每个中的10.2都是不同的,因为它们在不同的位数后终止。因此它们是不同的:

>> if (single(10.2) == 10.2) disp('honk'); end
>> if (single(10.2) == single(10.2)) disp('honk'); end
honk

你需要在一些小差异中检查是否相等:

 eps = 0.001;
 result = abs(array-10.2) < eps;

您可以使用whos:

找到数组中使用的精度
>> whos A
  Name      Size            Bytes  Class     Attributes

  A         1x2                 8  single      

答案 2 :(得分:1)

创建一个MATLAB函数文件,该文件将接受模数值(从3到9;即Z3到Z9)和 将输出模数条件描述的最小可能值。

样本模拟:

  
    

Z = [3 4 5]; %Modulo Z3,Z4和Z5

         

r = [2 1 4]; %剩余价值

         

最低可能值为29。

  

Z输入必须是一个数组矩阵...您可以在其中键入3到9之间的任何数字....您可以按任意顺序键入3,4,5,6,7,8,9,在任何配对或分组......

r输入也应该等于z输入的数量......

虽然模数条件......输出应该产生尽可能少的值...