为什么IEEE-754浮点数不能在平台之间交换?

Dam*_*ien 6 c c++ serialization ieee-754 floating-point-conversion

已经断言(甚至考虑字节字节序)IEEE754浮点并不保证在平台之间可以交换.

所以:

  • 理论上,为什么IEEE浮点不能在平台之间交换?
  • 这些问题是否适用于现代硬件平台(例如i686,x64,arm)?

如果问题是有效的,您能否请举例说明这种情况(首选C或C++)?


动机:一些GPS 制造商在"符合IEEE-754标准的浮点值"中为(例如)纬度,经度和原始数据交换其二进制格式.所以,我无法控制选择文本格式或其他"便携式"格式.因此,我的问题是何时可能会或可能不会发生差异.

Eri*_*hil 7

IEEE 754第3.4条规定了二进制交换格式编码.给定浮点格式(下面),交换格式将符号位置于最高有效位中,将下一个最高有效位中的偏置指数位置位,并将有效位编码置于最低有效位中.未指定从位到字节的映射,因此系统可以使用little-endian,big-endian或其他排序.

第3.6节规定了各种格式宽度的格式参数,包括64位二进制,其中有一个符号位,11个指数字段位和52个有效位字段位.该子句还规定了指数偏差.

第3.3和3.4条规定了该格式所代表的数据.

因此,为了交换IEEE-754浮点数据,似乎系统只需要就两件事达成一致:使用哪种格式(例如,64位二进制)以及如何来回获取位(例如,如何映射)用于写入文件或网络消息的位到字节.

  • @Damien:该语言允许系统在内部使用不同的格式.例如,它可能存储带有显式前导位而不是隐式的有效数字,并且它可能使用单独的位来标记NaN和无穷大.但是,我不知道任何系统,其中IEEE-754 64位二进制值到内存的正常存储不会产生通常的交换格式.英特尔扩展格式不是IEEE-754 64位格式; 它是一种自定义英特尔格式.以64位格式存储它的指令是类型之间的转换,而不仅仅是格式更改. (3认同)