C++ 是C+中的长双精度+;IEEE';是二进制128吗?

C++ 是C+中的长双精度+;IEEE';是二进制128吗?,c++,floating-point,double,ieee-754,long-double,C++,Floating Point,Double,Ieee 754,Long Double,发件人: 在C++中,代码> long double < /COD>是指浮点数据类型,通常比双精度更精确。但是,与C++的其他浮点类型一样,它可能不一定映射到IEEE格式 在GNU C编译器中,long double在x86处理器上是80位扩展精度,而不考虑用于该类型的物理存储(可以是96位或128位)。在某些其他体系结构上,长双精度可以是双精度(例如在PowerPC上)或128位四精度(例如在SPARC上)。从gcc 4.3开始,x86上也支持四倍精度,但作为非标准类型\uu float12

发件人:

在C++中,<>代码> long double < /COD>是指浮点数据类型,通常比双精度更精确。但是,与C++的其他浮点类型一样,它可能不一定映射到IEEE格式

在GNU C编译器中,
long double
在x86处理器上是80位扩展精度,而不考虑用于该类型的物理存储(可以是96位或128位)。在某些其他体系结构上,
长双精度
可以是
双精度
(例如在PowerPC上)或128位四精度(例如在SPARC上)。从gcc 4.3开始,x86上也支持四倍精度,但作为非标准类型
\uu float128
而不是
长双精度

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

英特尔XC++编译器,另一方面,默认情况下,可以扩展精度模式。在OSX上,长双精度是80位扩展精度

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

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

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

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

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

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

因为x87支持。一些较新的平台,如摩托罗拉6888x、英特尔i960和安腾也支持这种类型,因此编译器将其用于
long double
,而不是采用速度慢得多的软件模拟,这是有意义的

这也是PowerPC在默认情况下使用
long double
的原因,因为您可以使用硬件
double
单元,这使得操作更快。旧的NVIDIA CUDA内核不支持双精度,因此许多人使用浮点来获得更高的精度。看

大多数其他体系结构没有用于大于64位的浮点类型的硬件,因此他们选择IEEE-754四倍精度格式以便于实现和更好的前向兼容性,因为如果有一天真正的硬件支持128位浮点,那么很可能是IEEE-754四倍精度。目前,Sparc是唯一一种硬件支持四倍精度的体系结构

也就是说,大多数编译器都可以选择更改
longdouble
的基本格式。例如,GCC中有
-mlong-double-64/80/128
-m96/128位长的double
,以及
-mabi=ibmlongdouble/ieeelongdoull

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

因为x87支持。一些较新的平台,如摩托罗拉6888x、英特尔i960和安腾也支持这种类型,因此编译器将其用于
long double
,而不是采用速度慢得多的软件模拟,这是有意义的

这也是PowerPC在默认情况下使用
long double
的原因,因为您可以使用硬件
double
单元,这使得操作更快。旧的NVIDIA CUDA内核不支持双精度,因此许多人使用浮点来获得更高的精度。看

大多数其他体系结构没有用于大于64位的浮点类型的硬件,因此他们选择IEEE-754四倍精度格式以便于实现和更好的前向兼容性,因为如果有一天真正的硬件支持128位浮点,那么很可能是IEEE-754四倍精度。目前,Sparc是唯一一种硬件支持四倍精度的体系结构


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

还请注意,它甚至没有说
double
需要映射到IEEE格式。在Windows x64上,
long-double
=
double
=IEEE-754二进制64。ABI根本没有选择x87 80位扩展精度的类型。其他x86-64系统将其公开为长双精度。所以重要的不是编译器,而是目标ABI。GCC目标窗口将遵循ABI。@默认情况下,Windows上的PeterCordes Clang和GCC支持扩展精度
长双精度
。不过,您可以使用
-mlong-double-64
将其关闭。ICC还具有与MSVC和GCC@PeterCordes我猜是因为您不需要将GCC和MSVC对象链接在一起。但问题偶尔会发生,因为之前mingw使用的是MS的运行时,它不支持80位长的double,所以不能使用printf打印长的double。现在他们实现了自己的运行时,所以这不是问题anymore@PeterCordes我想知道哪些Windows/MSOffice DLL在其导出的函数中传递/接收
long double
。我想这是因为
长双精度