比较 Matlab 中显示的 double 数字

Compare displayed digits of double in Matlab

我需要在 Matlab 中比较两个双精度值并检查它们是否相等。现在将两个比较值显示给用户,因此他可以在必要时检查打印结果。

现在我需要知道:如果它们的十进制表示(使用 15 位有效数字)相等,是否可以比较两个 double 值使它们相等?出于性能原因,我不想比较结果字符串。

例如,两个十六进制值 3fd04b2bcf6173483fd04b2bcf617359 表示相同的显示数字,因此应视为相等,而 3fd04b2bcf6173483fd04b2bcf617347 具有不同的十进制表示并且应该被视为不同的,即使它们的差异更低:

fprintf('eq: %.15g\n', hex2num('3fd04b2bcf617348'), hex2num('3fd04b2bcf617359'))
fprintf('ne: %.15g\n', hex2num('3fd04b2bcf617348'), hex2num('3fd04b2bcf617347'))

您可以将 hex2num 创建的值四舍五入到 15 位。这是使用 round 函数完成的。

对于MATLAB R2014b及更高版本,您可以直接指定精度

b = round(a,15);

对于旧版本,round 只是四舍五入为整数,因此您必须手动执行:

b = round(10^15 .* a) ./ 10^15;

如果在四舍五入后比较数字,您会得到所需的行为:

a = [ hex2num('3fd04b2bcf617348'), hex2num('3fd04b2bcf617359') ; ...
      hex2num('3fd04b2bcf617348'), hex2num('3fd04b2bcf617347') ];

% Round to 15 digits
b = round(10^15 .* a) ./ 10^15;

% Compare results
abs(b(1,1) - b(1,2)) < 4*eps(b(1,1))
ans = 
     1

abs(b(2,1) - b(2,2)) < 4*eps(b(2,1))
ans = 
     0