为什么我的64位机器上的双倍和长倍完全相同?

时间:2012-01-19 07:03:14

标签: c++ double long-double

这个问题可能听起来像初学者,但是当我发现这个问题时,我认为我或者是初学者,或者我的作品缺少一些东西:

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。

2 个答案:

答案 0 :(得分:6)

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

有关详细信息,另请参阅here

答案 1 :(得分:2)

所有基本类型的大小都是实现定义的 最低。特别值得一提的是,double float 精度和范围不会低于long doubledouble的精度和范围不会低于double

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