我需要在Matlab中比较两个double值并检查它们是否相等。现在,两个比较值显示给用户,因此他可以在必要时检查打印结果。
现在我需要知道:如果它们的十进制表示(使用15位有效数字)相等,是否可以比较两个双精度值以使它们相等?出于性能原因,我宁愿不比较结果字符串。
例如,两个十六进制值3fd04b2bcf617348
和3fd04b2bcf617359
表示相同的显示数字,因此应该被视为相等,而3fd04b2bcf617348
和3fd04b2bcf617347
具有不同的十进制表示,并且应该被视为不同,即使他们的差异较小:
fprintf('eq: %.15g\n', hex2num('3fd04b2bcf617348'), hex2num('3fd04b2bcf617359'))
fprintf('ne: %.15g\n', hex2num('3fd04b2bcf617348'), hex2num('3fd04b2bcf617347'))
答案 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