来自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位表示形式?
答案 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-double
,PowerPC有-mabi=ibmlongdouble/ieeelongdouble