当没有可用的固定大小浮点类型时,处理浮点值的字节顺序

时间:2014-03-30 02:48:17

标签: c++ floating-point cross-platform endianness floating-point-conversion

我正在编写二进制文件读取器/写入器,并决定要处理字节序问题,我会将所有数据转换为" network" (大)写作时的字节顺序读取时的主机字节序。我避免hton*,因为我不想仅仅为这些功能与winsock建立链接。

我的主要困惑来自于如何处理浮点值。对于所有整数值,我在<cstdint>uint32_t等)中都有大小的类型,但是从我的研究中看,浮点类型没有这样的等价物。我希望在写入时将所有浮点值转换为32位表示,并将其转换回主机上使用的任何精度(对于我的应用程序,32位就足够了)。这样我就可以精确地知道浮点值的写入和读取字节数;而不是如果我使用sizeof(float)sizeof(float)在加载文件的机器上与编写它的机器不同。

我刚刚意识到使用frexp以整数方式获取尾数和指数,将这些整数写出(具有一些固定大小),然后读取整数并重构浮点值的可能性使用ldexp。这看起来很有希望,但是我想知道在没有htonf / ntohf 的情况下是否存在任何普遍接受或推荐的处理浮点字符串的方法。

我几乎可以肯定地知道我将很快定位的任何平台将float代表32位,但我想让我现在编写的代码与我兼容可用于未来的项目。

1 个答案:

答案 0 :(得分:2)

如果您想要完全跨平台且符合标准,那么frexp / ldexp解决方案是最好的方法。 (尽管您可能需要考虑源或目标硬件使用十进制浮点的高度理论情况。)

假设一台或另一台机器没有32位浮点表示。然后,该机器上没有与32位浮点指针编号兼容的数据类型,无论字节顺序如何。因此,没有标准的方法将非32位浮点数转换为可传输的32位表示,或者将传输的32位表示转换为本机非32位浮点数。

您可以将范围限制为具有32位浮点表示的计算机,但是您需要假设两台计算机具有相同的数字和位专用于符号,指数和尾数。情况可能就是这样,因为IEEE-754格式现在几乎是通用的,但C ++并不坚持它,至少可以想象有一台机器可以实现1/8/23位浮点数。在低阶端而不是高阶端签名位。

简而言之,字节序只是二进制浮点格式之间可能存在的不兼容性之一。但是,将每个浮点数减少到两个整数可以避免必须处理其他不兼容性(基数除外)。