首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中long double是IEEE binary128的实现吗?

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

Stack Overflow用户
提问于 2018-10-11 14:42:27
回答 2查看 2.7K关注 0票数 5

来自双倍

在C++中,long double指的是比双精度更精确的浮点数据类型.然而,与C++的其他浮点类型一样,它不一定会映射到IEEE格式。 ..。 使用GNU编译器,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)上,双精度模式是默认的,长时间的双精度操作可以有效地减少到双精度。 另一方面,英特尔的C++ x86编译器在默认情况下支持扩展精度模式.在OS上,长双是80位扩展精度.

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-11 15:07:59

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

因为某些平台可能能够在硬件上提供高效的80位浮点操作,但不能提供128位浮点操作。对于标准没有指定sizeof(int)的原因也是一样的--在某些平台上,32位整数可能不是有效/可用的。

票数 7
EN

Stack Overflow用户

发布于 2019-04-15 15:58:46

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

不是的。C++甚至不要求对浮点类型使用IEEE-754。看见

只有在C++11之后,您才可以检查平台是否在std::numeric_limits::is_iec559中使用IEEE-754。

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

因为x87支持80位IEEE-754扩展精度格式。一些后来的平台,如摩托罗拉6888x和英特尔i960也支持这种类型,所以编译器将其用于long double而不是求助于速度更慢的软件仿真是有意义的。

这也是PowerPC默认使用双倍用于long double的原因,因为您可以使用硬件double单元来使操作更快。旧的NVIDIA核心没有硬件支持的double,所以很多人使用浮子为更高的精度。请参阅在GPU上用2 FP32仿真FP32

如果Itanium的浮点寄存器是82位宽,那么long double极有可能具有相同的宽度,并有适当的填充以使其对齐到128位。

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

尽管如此,大多数编译器仍然可以选择更改long double的底层格式。例如GCC中有-mlong-double-64/80/128-m96/128bit-long-double表示x86-mabi=ibmlongdouble/ieeelongdouble表示PowerPC

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52762881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档