gpt4 book ai didi

c++ - 更改 float 字节序的最正确方法是什么

转载 作者:行者123 更新时间:2023-11-30 01:16:21 26 4
gpt4 key购买 nike

阅读此文:http://commandcenter.blogspot.fi/2012/04/byte-order-fallacy.html

文章中的方法是这样的:

从大端读取:

int i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

从小端读取:

int i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

有什么方法可以将这种意识形态转换为 float 吗?

那么有什么办法可以避免 if(swap_needed) swap(data);

我的一个想法是从数据中分别读取符号位、尾数和指数,计算基于它们的浮点值。

最佳答案

如果您继续使用简单的非英特尔 IEEE-754 float 或 double ,Sebastian Redl 的答案是正确的,但如果英特尔对 double 和长 double 的特殊表示,以及所有其他关于长 double 格式的特殊想法,它将失败。只有很少的体系结构使用标准的 IEEE-754 浮点格式。即使是可以随意使用 BE/LE 的最简单的 mip,也有一个特殊的 MIPS64 16 字节长 double 格式。

所以没有正确和简单的方法来对 float 进行快速字节交换。但是,我编写了代码以将各种架构中的 float 读取到当前架构中,这是一项艰巨的任务。 https://github.com/parrot/parrot/blob/native_pbc2/src/packfile/pf_items.c#L553注:intel特长是https://github.com/parrot/parrot/blob/native_pbc2/src/packfile/pf_items.c#L605中标有i的extra normalization bit(尾数的最高位63)

即我在 BE 和 LE 之间进行转换:

  • 浮点型 0 = IEEE-754 8 字节 double (binary64)
  • 浮点类型 1 = Intel 80 位长 double 存储在 12 字节 (i386) 或对齐到 16 字节 (x86_64/ia64)
  • Floattype 2 = IEEE-754 128 位四精度存储在 16 字节中,Sparc64 quad-float 或 __float128,gcc since 4.3 (binary128)
  • 浮点类型 3 = IEEE-754 4 字节 float (binary32)
  • 浮点型 4 = PowerPC 16 字节 double (-mlong-double-128)

还没有:

  • 浮点类型 5 = IEEE-754 2 字节半精度 float (binary16)
  • 浮点型 6 = MIPS64 16 字节长 double
  • 浮点型 7 = AIX 16 字节长 double
  • CRAY 和更多的疯狂

由于没有太大的需求,我一直没有为这个 float 转换代码制作一个合适的库。顺便提一句。我使用更快的 native 字节交换函数,请参阅 https://github.com/parrot/parrot/blob/native_pbc2/include/parrot/bswap.h

通常你打印最大。精确到一个字符串并读取这个字符串。在那里,您唯一的问题就是找出您的最大值。精度。

关于c++ - 更改 float 字节序的最正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778040/

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