我试图将一个双精度数组与一个标量双精度数进行比较以获得相等,但在某些情况下永远不会识别出相等性。我怀疑这与双重表示的方式有关(例如,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
。实际上,每个元素的模数等于0
或0.2
,如下面对数组中上面的数字序列所示:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
同样,如果将值手动放入数组并采用模数,则会获得所有0
的预期值。
答案 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输入的数量......
虽然模数条件......输出应该产生尽可能少的值...