【问题标题】:Double(s) across different cpu architectures?跨不同 cpu 架构的双倍?
【发布时间】:2010-11-17 17:56:56
【问题描述】:

是否可以通过网络发送双浮点值(当然要针对正确的字节顺序进行调整)并在不同的 cpu 架构上互换使用它们,特别是 i386、mips(几个不同的内核)、powerpc(e300、e500)。没有非常旧的硬件。

使用 gcc 4.2.1 作为带有 -Os 的编译器,适用于所有架构。

据说它到处都是 IEEE-754 标准(是吗?),但正如维基百科所说:

IEEE 754-1985 允许在实现中进行许多变化(例如某些值的编码和某些异常的检测)。 IEEE 754-2008 已经收紧了其中的许多内容,但仍然存在一些变化(尤其是二进制格式)。

我不打算传递 NaN 或其他特殊的东西,只是传递有效的十进制数字。

【问题讨论】:

  • 如果您出于性能原因避免使用文本,您可能需要查看协议缓冲区:code.google.com/p/protobuf 他们处理字节序问题、对齐(与发送 C 数据结构相比)等。他们做假设发送方和接收方符合 IEEE-754 标准,请使用浮点数。

标签: serialization floating-point portability cpu-architecture


【解决方案1】:

如果您想发送标准化数字的表示形式,那么您在任何现代架构上都是完全安全的。如有任何疑问,请查看架构手册。对于非规范化的数字,您必须检查。

当然,您必须能够使用正确的字节顺序分解成字节并在另一端重新组装,但听起来您知道如何做到这一点。

如上所述,您不能期望不同的 CPU 以相同的方式实现标准的每个部分,但这不是必需的。

从 IEEE 浮点到 ASCII 的转换充满了错误; Guy SteeleWill Clinger 在 1990 年代有好论文。 Burger 和 Dybvig 有一个 later followup on doing it faster

【讨论】:

  • 刚刚检查了 SQLite 的来源,它声称“跨平台数据库文件”——它只关心其 REAL 数据类型的字节顺序,它本质上是一个 double。听起来我可以安全了。谢谢
【解决方案2】:

您实际上是在问“我可以在系统之间无缝传输二进制数据吗”。答案是肯定的,只要两个系统同意相同的格式。如果您知道您期望使用哪种 CPU,请检查他们的 IEEE 标准合规性,您应该可以开展业务。

【讨论】:

  • 检查这正是我想要避免自己做的事情...... :)
  • PowerPC 将符合 IEEE 标准,但它是 Motorolla 字节排序,而 x86 符合 IEEE 但英特尔字节排序。
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多