C ++中的long double是否是IEEE的binary128的实现?

时间:2018-10-11 14:42:27

标签: c++ floating-point double ieee-754 long-double

来自https://en.wikipedia.org/wiki/Long_double

  

在C ++中,long double引用的浮点数据类型通常比双精度更精确。但是,与C ++的其他浮点类型一样,它不一定映射到IEEE格式。

     

...

     

对于GNU C编译器,long double在x86处理器上具有80位扩展精度,而与该类型所使用的物理存储无关(可以为96位或128位)。在其他一些体系结构上,long double可以是double-double(例如在PowerPC上)或128位四倍精度(例如在SPARC上)。从gcc 4.3开始,x86还支持四倍精度,但作为非标准类型__float128而不是long double

     

在Linux上使用gcc时,默认设置为80位扩展精度。在某些BSD操作系统(FreeBSD和OpenBSD)上,默认为双精度模式,长双精度操作有效地降低为双精度。

     

另一方面,默认情况下,用于x86的Intel C ++编译器启用扩展精度模式。在OS X上,long double是80位扩展精度。

看来long double可能不是IEEE的binary128的实现,但是为什么不这样做呢?为什么在某些情况下默认使用80位表示形式?

2 个答案:

答案 0 :(得分:3)

  

为什么在某些情况下默认使用80位表示形式?

因为某些平台可能能够在硬件中提供有效的80位浮点运算,但不能在128位中提供。这与标准未指定sizeof(int)的原因相同-在某些平台上32位整数可能无效/不可用。

答案 1 :(得分:1)

  

为什么在某些情况下默认使用80位表示形式?

因为x87支持80-bit IEEE-754 extended precision format。摩托罗拉6888x,英特尔i960和安腾(Itanium)等后来的平台也支持该类型,因此对于编译器而言,将其用于long double是有意义的,而不是求助于慢得多的软件仿真

这也是PowerPC默认将double-double用于long double的原因,因为您可以利用硬件double单元,从而使操作更快。旧的NVIDIA CUDA内核不支持double的硬件,因此许多人使用float-float以获得更高的精度。参见Emulating FP64 with 2 FP32 on a GPU

大多数其他体系结构都没有用于大于64位浮点类型的硬件,因此,它们选择了IEEE-754四精度格式以简化实现并获得更好的前向兼容性,因为如果一天支持128位浮点数出现在实际的硬件上,很有可能是IEEE-754四倍精度。当前,Sparc是唯一具有四倍精度的硬件支持的体系结构

也就是说,大多数编译器都可以选择更改long double的基础格式。例如,在GCC中,x86-mlong-double-64/80/128-m96/128bit-long-doublePowerPC-mabi=ibmlongdouble/ieeelongdouble