gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:43:31 24 4
gpt4 key购买 nike

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

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

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

我知道几乎可以肯定,我很快将针对的任何平台都会有 float用 32 位表示,但我想让我现在编写的代码尽可能兼容,以便在未来的项目中使用。

最佳答案

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

假设一台或另一台机器没有 32 位浮点表示法。那么无论字节顺序如何,该机器上都没有与 32 位浮点指针数位兼容的数据类型。因此,没有标准方法可以将非 32 位 float 转换为可传输的 32 位表示形式,或将传输的 32 位表示形式转换为 native 非 32 位 float 。

您可以将您的范围限制在具有 32 位浮点表示的机器上,但是您需要假设两台机器具有相同数量和顺序的专用于符号、指数和尾数的位。这很可能是这种情况,因为 IEEE-754 格式如今几乎是通用的,但 C++ 并不坚持它,并且至少可以想象有一台机器可以实现 1/8/23 位 float ,其中符号位在低位端而不是在高位端。

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

关于c++ - 当没有固定大小的浮点类型可用时处理浮点值的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22739680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com