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

Edu*_*rdo 7 floating-point double ieee-754 long-double c++11

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

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

...

使用 GNU C 编译器,long double无论该类型使用何种物理存储(可以是 96 位或 128 位),x86 处理器上的精度都是 80 位。在某些其他架构上,long double可以是double-double(例如在 PowerPC 上)或 128 位四倍精度(例如在 SPARC 上)。从 gcc 4.3 开始,x86 上也支持四倍精度,但作为非标准类型__float128而不是long double.

Linux 上的 gcc 默认为 80 位扩展精度;在一些 BSD 操作系统(FreeBSD 和 OpenBSD)上,双精度模式是默认的,长双精度操作被有效地减少为双精度。

另一方面,面向 x86 的英特尔 C++ 编译器默认启用扩展精度模式。在 OS X 上,long double 是 80 位扩展精度。

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

Max*_*hof 8

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

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