更改浮点数字节顺序的最正确方法是什么

0xb*_*00d 1 c++ endianness

读完这篇文章:http ://commandcenter.blogspot.fi/2012/04/byte-order-fallacy.html

文章中的方法是这样的:

从大端读取:

int i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
Run Code Online (Sandbox Code Playgroud)

从小端读取:

int i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将这种思想转换为浮点数吗?

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

我的一个想法是从数据中单独读取符号位、尾数和指数,并根据它们计算浮点值。

rur*_*ban 5

如果您继续使用简单的非英特尔 IEEE-754 浮点或双精度,Sebastian Redl 的答案是正确的,但如果使用英特尔双精度和长双精度的特殊表示,以及其长双精度格式的所有其他特殊想法,它将失败。只有极少数架构使用标准 IEEE-754 浮点格式。即使是最简单的mips,可以随意使用BE/LE,也有特殊的MIPS64 16字节长双精度格式。

因此,没有正确且简单的方法来对浮点数进行快速字节交换。然而,我编写了代码来将各种架构中的浮点数读取到当前架构中,这是一项艰巨的任务。https://github.com/parrot/parrot/blob/native_pbc2/src/packfile/pf_items.c#L553 注意:intel 的特色是 https 中用 i 标记的额外归一化位(尾数的最高位 63): //github.com/parrot/parrot/blob/native_pbc2/src/packfile/pf_items.c#L605

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

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

还没有:

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

由于没有太大的需要,我从未为这个浮点转换代码创建一个合适的库。顺便提一句。我使用更快的本机 byteswap 函数,请参阅https://github.com/parrot/parrot/blob/native_pbc2/include/parrot/bswap.h

通常你打印最大。精度为字符串并读取该字符串。在那里你唯一的问题是找出你的最大值。精确。