MATLAB:使用sscanf从字符串中读取float时的数字不正确

时间:2015-11-24 10:56:36

标签: matlab scanf textscan

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

' 8.2' - > 8.199999999999999。

此外,在将8.2 GHz转换为8.2e9 Hz(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 OS还是Win机器上。

任何提示都非常感谢!

此致

1 个答案:

答案 0 :(得分:0)

你不应该在没有公差的情况下比较两个浮点数是否相等。请参阅:What Every Computer Scientist Should Know About Floating-Point ArithmeticAccuracy of Floating Point Data

一种可能的方法:

% 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来检查是否相等,这是机器的浮点相对精度。