在 Matlab 中,我通过两种方式计算 2D 点集合的旋转:一种通过常规矩阵-矩阵乘积,另一种通过迭代向量-矩阵乘积,如下所示。
>> points = % read data from some file, Nx2 matrix
>> R = [cosd(-18), sind(-18); -sind(-18), cosd(-18)]; % My rotation matrix
>> prod1 = points * R;
>> numpt = size(points, 1);
>> for k=1:numpt, prod2(k,:) = points(k,:) * R; end;
我使用的是装有 Windows 10 操作系统的“常规”(基于英特尔)PC。
事实证明,在某些计算机上,
prod1 ~= prod2
,而在其他计算机上,prod1 == prod2
。这可以通过检查
>> max(max(abs(prod2 - prod1)))
ans =
1.1102e-16
这种差异在“较弱”的计算机上等于
0
,在我的“强大”计算机上等于非零。
我想这种情况发生在某些计算机上而不是其他计算机上的原因是它发生的地方,矩阵乘法有一些硬件加速(可能涉及
madd
三元运算,因这种差异而臭名昭着)。
这是一些已知问题,例如“错误”吗? 是否有解决方法,例如禁用或暂停这种 H/W 加速?
作为单元测试的一部分,我正在寻求在不同计算机上获得相同的计算结果。我可以满足于“近乎平等”。但如果我能得到真正的平等,我就不应该这样做。