matlab中的fread和fwrite不完全一致

时间:2016-11-15 22:15:06

标签: matlab binary precision fwrite fread

我想将浮点数保存在二进制文件中,然后再读取它们以进行进一步处理。不幸的是,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

答案与输入不同。我怎样才能解决这个问题?我应该搜索什么?是圆形,精度还是其他问题?

1 个答案:

答案 0 :(得分:1)

浮点数are never exactsingle精度浮点数(float32only 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的默认数据类型doublefloat64)具有两倍的可用位,这将为您提供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,它是符号数学工具箱的一部分,或者提供更高/可变精度的类似包。