编译器之间的浮点二进制布局

时间:2011-10-31 11:17:26

标签: c++ c visual-c++ gcc ieee-754

我正在清理我们的一些网络代码,同时用更多explcit typedef替换各种整数类型(intunsigned short,...),例如int32_t和{{ 1}}我想知道不同编译器之间的可移植性uint16_tdouble。我们发送的结构类似于以下内容:

float

到目前为止,只使用VC ++编译的程序,但是计划在GCC上使用协议。

现在的问题是:即使然后由不同的编译器解释,struct foo { uint32_t id; double dbl; }; ... // copy_packed() copies packed bytes of integral type and adheres // to network byte-ordering copy_packed(int32_t data, char* buffer, char* end); copy_packed(uint32_t data, char* buffer, char* end); copy_packed(uint16_t data, char* buffer, char* end); ... // overload for structure types calls overloads for its members void copy_packed(foo &data, char* buffer, char* end) { copy_packed(data.id, buffer); copy_packed(data.id, buffer); }; amd double是否可以安全地通过网络发送?问题 - 据我所知 - 归结为GCC和VC ++是否符合IEEE754。或者可能提供转换为符合包装的功能?

有关此事的任何提示?

3 个答案:

答案 0 :(得分:4)

您可以询问编译器:std::numeric_limits<T>::is_iec559将告诉您类型T是否为IEC559(IEEE754)类型。

答案 1 :(得分:4)

不是很好。 IEEE没有定义字节顺序,并非所有系统都是IEEE。 真正的问题是你必须具有多么便携。 IEEE几乎就是这样 适用于现代Unix平台以及Windows;如果你的 可移植性仅限于这些,您通常可以输入float 进入uint32_t,双进uint64_t,并处理输入和 那样输出。如果你必须考虑大型机(和 可能是嵌入式处理器 - 我不太熟悉它们, 你还有很多工作要做;主要浮点数 大型机甚至不是基础2.

答案 2 :(得分:2)

这是我在浮点算术上看过的最好的文章之一。 Jump in to Current IEEE 754 Implementations

  

IEEE 754算法的当前实现可以分为两个   群体以他们支持不同的程度来区分   硬件中的浮点格式。基于扩展的系统,   以英特尔x86系列处理器为例,提供全面的   支持扩展的双精度格式,但只支持部分格式   支持单精度和双精度:它们提供指令   以单精度和双精度加载或存储数据,转换它   他们提供的是扩展的双重格式的动态   特殊模式(不是默认值)中的算术结果   即使它们,操作也会四舍五入为单精度或双精度   以扩展的双重格式保存在寄存器中。 (摩托罗拉68000   系列处理器圆形结果的精度和范围   这些模式中的单或双格式。 Intel x86兼容   处理器将结果舍入为单精度或双精度   格式但保留与扩展双格式相同的范围。)   单/双系统,包括大多数RISC处理器,提供完整   支持单精度和双精度格式,但不支持   符合IEEE标准的扩展双精度格式。 (IBM POWER   架构仅提供对单精度的部分支持,但是   为了本节的目的,我们将其分类为单/双   系统。)