在Matlab中写入文件时出现浮点错误?
我不确定我是否遗漏了一些简单的东西,但以下代码失败(a和b是相同的): 输出:在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 =
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的演员阵容失败了,我想马克·迪金森回答得很好。