【问题标题】:Storing a 32 bit float in a file portability concerns在文件可移植性问题中存储 32 位浮点数
【发布时间】:2011-10-06 15:08:07
【问题描述】:

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

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 位。

【问题讨论】:

标签: c++ floating-point portability


【解决方案1】:

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

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

【讨论】:

  • 我只针对 Windows。我认为windows总是小端。除了他们的手机软件。
  • 我的 +1,这是正确的答案。您可以存储 IEEE 浮点,因为它是标准,但您的应用程序仍然必须处理 Byte-Order。
【解决方案2】:

如果可以的话,将数据存储为文本而不是原始二进制文件总是更好。这避免了上述问题和无数其他问题,例如:

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

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

当然,不利的一面是文本需要更多存储空间,因此如果您有大量数据,那么文本可能不是一个选项。

【讨论】:

  • 将浮点数存储为文本的缺点是它是双向的有损转换。在某些应用中,这是不可接受的。 (当然,如果您只是在谈论存储位的十六进制表示,那么您指出的所有问题都会重新发挥作用。)
  • 好点 - 通常您只想存储适当数量的有效(十进制)数字,但如果您需要位级别的一致性,那么是的,您使用十六进制表示的建议可能是go(虽然它失去了一点便携性)。
  • 我没有看到十六进制表示比纯二进制表示的好处。您仍然需要处理原始列表中的所有内容。把它变成十六进制不会改变任何东西。由于 OP 处理的是 Windows 机器,我认为两端都支持 IEE-754 是合理的。
  • 十六进制具有独立于字节序的优点,并且您没有填充,对齐等各种其他二进制问题。但是您仍然存在表示问题。
  • 也许我们用“十六进制”表示不同的东西。我正在考虑一些浮点表示的位的十六进制表示。这与简单的八位字节流具有相同的字节序问题。
【解决方案3】:

float 的大小可能会改变,但double 不会。您确定为此目的使用double 不是一个更好的主意吗? double 总是 8 个字节。

【讨论】:

  • 你能提供一个浮点数不是 4 字节的例子吗?好奇自己
  • 我正在使用浮点数将偏移量存储在大于 int 限制(大约 4gb)的文件中。我选择了浮动,因为我的文件不会变得足够大,需要双偏移。如果双打更可靠,我不介意使用双打。
  • @user826228,浮点数不能完全存储大的数字,因为它实际上具有比 32 位 int 更低的精度。它的范围更广,因为它使用指数。如果您需要比 4G 更大的值,请使用通常称为 long long 或 __int64 的 8 字节 int。
  • 您确实意识到使用浮点数来存储大于 4294967295 的偏移量意味着由于精度原因您将无法将某些值作为偏移量? (哎呀,这同样适用于许多小于 0xffffffff 的数字。)
  • 在生活中只需要一点点确定性。否则会很无聊。
【解决方案4】:

float 在指代 IEEE 单精度浮点时非常普遍,无论平台是 32 位还是 64 位。

【讨论】:

    【解决方案5】:

    在 Windows 平台上,sizeof(float) 始终为 4 个字节,无论它是 32 位还是 64 位进程/操作系统。不了解标准,但在大多数平台上,浮点数的大小为四个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2010-12-08
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2012-03-13
      • 2018-03-16
      • 2019-02-10
      相关资源
      最近更新 更多