C ++中的长两倍是IEEE二进制128的实现吗?

问题描述 投票:0回答:2

来自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的英特尔C ++编译器默认启用扩展精度模式。在OS X上,long double是80位扩展精度。

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

c++ floating-point double ieee-754 long-double
2个回答
3
投票

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

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


1
投票

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

因为x87支持80-bit IEEE-754 extended precision format。一些后来的平台,如Motorola 6888x,Intel 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的基础格式。例如,在海湾合作委员会有-mlong-double-64/80/128-m96/128bit-long-doublex86-mabi=ibmlongdouble/ieeelongdoublePowerPC

© www.soinside.com 2019 - 2024. All rights reserved.