我试图从文本文件中导入浮点数据。为此,我将文件中的各行加载到字符串中,然后用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=8
和fstart=8e9
,一切正常。上面的例子我哪里出错了?
在R2015a,b和R2014a中也出现问题,无论是在MAC OS还是Win机器上。
任何提示都非常感谢!
此致
答案 0 :(得分:0)
你不应该在没有公差的情况下比较两个浮点数是否相等。请参阅:What Every Computer Scientist Should Know About Floating-Point Arithmetic和Accuracy 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
来检查是否相等,这是机器的浮点相对精度。