在文件可移植性问题中存储32位浮点数

时间:2011-07-16 05:27:32

标签: c++ floating-point portability

如果我通过此代码将浮动文件存储在文件中

fwrite((void*)(&v), sizeof(v), 1, f); // v is a float.

使用此代码读取文件的程序多久会导致运行时错误,因为float是8个字节而不是4个?

float v;
fread((void*)(&v), sizeof(v), 1, f);
return v;

我是否可以始终读取4个字节并将其转换为8字节的浮点数?那会更便携吗?

强调不同的Windows平台64位与32位。

5 个答案:

答案 0 :(得分:6)

我不会担心浮动的 size 而更担心它的字节顺序。我要说绝大多数C ++实现都使用IEEE 754,这意味着浮点数总是32位和64位。

您可能希望序列化值的文本表示,或者特别注意确保字节顺序正确。

答案 1 :(得分:2)

如果您可以合理地将数据存储为文本而不是原始二进制文件,那么总是更好。这避免了上述问题以及无数其他问题,例如:

  • 端序
  • 元素大小
  • float et al
  • 的不同格式
  • 填充和/对齐
  • 不同程序版本之间的向前/向后兼容性

如果需要,它还可以使其他程序使用数据。

当然,缺点是文本需要更多存储空间,所以如果你有大量数据,那么文本可能不是一个选项。

答案 2 :(得分:1)

float的大小可能会发生变化,但double不会。你确定为此目的使用double是不是更好的主意? double总是8个字节。

答案 3 :(得分:0)

无论平台是32位还是64位,

浮动都非常通用,指的是IEEE单精度浮点数。

答案 4 :(得分:0)

在Windows平台上,sizeof(float)始终为4个字节,无论它是32位还是64位进程/ OS。不知道标准,但在大多数平台上,float的大小是四个字节。