为什么在我的 64 位机器上双精度和长双精度完全相同

Why are double and long double completely the same on my 64 bit machine?

本文关键字:双精度 我的 机器 为什么      更新时间:2023-10-16

这个问题听起来像是初学者,但是当我发现这个问题时,我认为我要么是初学者,要么我的comp缺少一些东西:

int main()
{
    cout << sizeof(double) << endl;
    cout << sizeof(long double) << endl;
    cout << DBL_DIG << endl;
    cout << LDBL_DIG << endl;
    return 0;
}

程序输出:

8

8

15

15

我以为long double是 10 个字节,有 18 个十进制数字,而double是 8 个字节,有 15 位数字,但似乎我错了。

为什么会这样?

在 64 位计算机上使用 MSVC 2010。

在 MSVC++ 中,long double 是您所发现的double的同义词。显然,这是为了利用仅限于64位操作的SSE/SSE2/SSE3指令集。

另请参阅此处了解更多信息。

所有基本类型的大小都是实现定义的,使用最低。 特别是,您所保证的只是double它的精度和范围并不比float低,而且long double的精度和范围也不比double小。

从实现质量的角度来看,编译器应该给出您是硬件提供的最好的。 仅许多(大多数?(体系结构具有两种硬件支持的浮点类型;在这样的架构上, doublelong double通常是相同的。 在一些架构,让这三者都相同可能是有意义的。 上英特尔,质量实现将有三种不同的类型,因为这就是硬件提供的(但实现仍然是即使所有三种浮点类型都相同,也符合(。 上另一方面,您可以为long double:10争论不同的尺寸(从未见过(、12 (g++( 或 16 字节,出于对齐原因(带有一些未使用的字节数(。 英特尔的实现,其中long double和 然而,double相同只是质量差,而不是不符合要求。