我想将浮点数保存在二进制文件中,然后再读取它们以进行进一步处理。不幸的是,fwrite和后来的fread确实改变了数字。
以下简单示例:
% Number to store
A = 0.123456789101112
% Generate and open txt file
fid = fopen('test_fread.txt','w','b');
% write A into test_fread.txt
fwrite(fid,A,'float32');
% close file
fclose(fid)
% open txt file
fid = fopen('test_fread.txt','r','b');
% read the file
fread(fid,'float32')
ans = 0.123456791043282
答案与输入不同。我怎样才能解决这个问题?我应该搜索什么?是圆形,精度还是其他问题?
答案 0 :(得分:1)
浮点数are never exact。 single
精度浮点数(float32
)only have 6-9 decimals of precision。对于纯十进制情况,这会转换为您所看到的问题。如果您还有一个整数组件,则效果会更加夸大:
% Sample number
A = 123456789.123456789;
% Write, rewind, and read back in
fID = fopen('test_fread.txt', 'w+', 'b');
fwrite(fID, A, 'float32');
frewind(fID);
B = fread(fID,'float32');
fclose(fID);
fprintf('A: %15.15f\nB: %15.15f\n', A, B);
返回:
A: 123456789.123456790000000
B: 123456792.000000000000000
请注意,MATLAB在这里将B
转换为double
。
MATLAB的默认数据类型double
(float64
)具有两倍的可用位,这将为您提供15-17 significant decimal digits。使用前面的示例,我们可以尝试:
% Sample number
A = 123456789.123456789;
% Write, rewind, and read back in
fID = fopen('test_fread.txt', 'w+', 'b');
fwrite(fID, A, 'float64');
frewind(fID);
B = fread(fID,'float64');
fclose(fID);
fprintf('A: %15.15f\nB: %15.15f\n', A, B);
返回:
A: 123456789.123456790000000
B: 123456789.123456790000000
耶。
如果在MATLAB中需要比double
更高的精度,则需要考虑使用vpa
,它是符号数学工具箱的一部分,或者提供更高/可变精度的类似包。