在Matlab中比较double的显示数字

时间:2015-02-09 14:57:38

标签: matlab comparison double

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以将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