在Matlab中写入文件时出现浮点错误?

在Matlab中写入文件时出现浮点错误?,matlab,file-io,floating-point,binary,Matlab,File Io,Floating Point,Binary,我不确定我是否遗漏了一些简单的东西,但以下代码失败(a和b是相同的): 输出: a = 2.1475e+009 b = -2.1475e+009 a = 2.1475e+009 b = 2.1475e+009 并且以下代码成功: a=single(2147483583) f=fopen('test','wb'); fwrite(f,a,'int32') fclose(f); f=fopen('test','rb'); b=fread(f,inf,'int32')

我不确定我是否遗漏了一些简单的东西,但以下代码失败(a和b是相同的):

输出:

a = 
   2.1475e+009
b =
   -2.1475e+009
a = 
   2.1475e+009
b =
   2.1475e+009
并且以下代码成功:

a=single(2147483583)
f=fopen('test','wb');
fwrite(f,a,'int32')
fclose(f); 
f=fopen('test','rb');
b=fread(f,inf,'int32');
fclose(f)
a
b
输出:

a = 
   2.1475e+009
b =
   -2.1475e+009
a = 
   2.1475e+009
b =
   2.1475e+009

有人知道为什么吗?

我对Matlab不太了解,但这里发生的事情似乎相当清楚。将
a
转换为浮点,然后将转换结果存储为32位有符号整数。但是最接近整数
2147483584
的单精度IEEE 754浮点是
2147483648.0
,或
2**31
。32位整数只能表示范围
[-2**31,2**31-1]
中的值,因此当您将此值作为整数写入时,它似乎会被包装为模
2**32
,以给出
-2**31
,而不是
2**31


相比之下,最接近
2147483583
的单精度浮点是
2147483520.0
,它适合32位整数。

我不太熟悉Matlab,但这里发生的事情似乎相当清楚。将
a
转换为浮点,然后将转换结果存储为32位有符号整数。但是最接近整数
2147483584
的单精度IEEE 754浮点是
2147483648.0
,或
2**31
。32位整数只能表示范围
[-2**31,2**31-1]
中的值,因此当您将此值作为整数写入时,它似乎会被包装为模
2**32
,以给出
-2**31
,而不是
2**31


相比之下,最接近
2147483583
的单精度浮点为
2147483520.0
,它适合32位整数。

在描述问题时,包含实际故障非常有用。添加输出以说明problem@twerdster:为什么要创建
单个
值并将其写入
int32
,这是故意的吗?如果是,您可能希望显式强制转换variables@Amro这是有意的,而且是明确的。我只是想知道Matlab cast失败的原因,我认为Mark Dickinson回答得很好。在描述问题时包含实际失败是非常有帮助的。添加了输出来说明问题problem@twerdster:为什么要创建
单个
值并将其写入
int32
,这是故意的吗?如果是,您可能希望显式强制转换variables@Amro这是有意的,而且是明确的。我只是想知道为什么Matlab的演员阵容失败了,我想马克·迪金森回答得很好。