10

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

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 个十进制数字,而double8 个字节,有 15 个数字,但似乎我错了。

为什么呢?

在 64 位机器上使用 MSVC 2010。

4

2 回答 2

6

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

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

于 2012-01-19T07:07:38.877 回答
2

所有基本类型的大小都是由实现定义的,具有最小值。特别是,您可以保证的只是double 精度和范围不低于float,并且long double精度和范围不低于double.

从实现质量的角度来看,编译器应该为您提供硬件提供的最好的。许多(大多数?)架构只有两种硬件支持的浮点类型;在这样的架构上, double并且long double通常是相同的。在某些架构上,让所有三个相同可能是有意义的。在英特尔上,高质量的实现将具有三种不同的类型,因为这是硬件提供的(但即使所有三种浮点类型都相同,实现仍然是兼容的)。另一方面,long double出于对齐原因(某些字节未使用),您可以争论不同的大小:10(从未见过)、12(g++)或 16 个字节。英特尔在哪里long double和 的实现double然而,相同只是质量差,而不是不合格。

于 2012-01-19T08:31:30.423 回答