我正在尝试从文本文件导入浮点数据。为了做到这一点,我将文件中的各个行加载到一个字符串中,然后用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=8
和fstart=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
来检查相等性。