MATLAB:使用sscanf从字符串中读取浮点值时,数字不正确



我正在尝试从文本文件导入浮点数据。为了做到这一点,我将文件中的各个行加载到一个字符串中,然后用sscanf解析它(textscan显示了类似的行为)。出于某种原因,sscanf在小数点后几位添加了一些偏差,这可以在输出变量为长时看到

'8.2'->8.199999999999999。

此外,在将8.2GHz转换为8.2e9Hz(Imported_array=Imported_array*10^9)之后,呼叫

Bin=find(Imported_array==Lookup_Value);

返回一个空矩阵。

一个最小的例子如下:

clc;
clear;
format long;
% String to Parse from Textfile(f in GHz)
string='8.200000000 1.406320e-01 -8.175100e-02 -6.981310e-04 1.972470e-03 -1.049100e-03 1.868090e-03 1.620270e-01 -8.879710e-02';
% Same Problem with a single number
% string='8.2';
% Lookup Value (in Hz)
fstart=8.2e9;
% Parse String
f=sscanf(string, '%f')
% Convert GHz to Hz
f=f*10^9
% Search Bin
Bin=find(f==fstart)
  • 使用string='8.2'时,也会出现同样的问题
  • 对于string=8fstart=8e9,一切正常
  • textscan显示了类似的行为

上面的例子哪里出错了?

该问题也发生在R2015a、b和R2014a中,均发生在MAC操作系统和Win计算机上。

非常感谢任何提示!

问候

在不包含公差的情况下,永远不应该比较两个浮点值是否相等。请参阅:每一位计算机科学家都应该知道的浮点运算和浮点数据的准确性。

一种潜在的方法:

% String to Parse from Textfile(f in GHz)
string='8.200000000 1.406320e-01 -8.175100e-02 -6.981310e-04 1.972470e-03 -1.049100e-03 1.868090e-03 1.620270e-01 -8.879710e-02';
% Lookup Value (in Hz)
fstart=8.2e9;
% Parse String
f=sscanf(string, '%f')
% Convert GHz to Hz
f=f*10^9
% Search Bin within tolerance
diffs = abs(f - fstart);
tol = 10^-6;
Bin=find(diffs < tol)

哪个返回:

Bin =
     1

这里值得注意的是,当你用f乘以10^9时,你也在乘以误差,这就是为什么公差如此(相对)大的原因。在测试相等性之前不操作数字的情况下,通常可以通过查看绝对差是否小于机器的浮点相对精度eps来检查相等性。

最新更新