这个问题可能听起来像初学者,但是当我发现这个问题时,我认为我或者是初学者,或者我的作品缺少一些东西:
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。
答案 0 :(得分:6)
在MSVC ++中,long double
是您发现的double
的同义词。显然,这是为了利用仅限于64位操作的SSE / SSE2 / SSE3指令集。
有关详细信息,另请参阅here。
答案 1 :(得分:2)
所有基本类型的大小都是实现定义的
最低。特别值得一提的是,double
float
精度和范围不会低于long
double
,double
的精度和范围不会低于double
。
从实现质量的角度来看,编译器应该给出
你是硬件提供的最好的。许多(大多数?)架构只
有两个硬件支持的浮点类型;在这样的架构上,
long double
和long double
通常相同。一些
架构,将三者完全相同可能是有意义的。上
英特尔的质量实现将有三种不同的类型,因为
这是硬件提供的(但实现仍然是
即使所有三种浮点类型都相同,也符合要求。上
另一方面,你可以争论long double
:10的不同大小
(从未见过),12(g ++)或16字节,出于对齐原因(有一些
字节未使用)。英特尔的实施,double
和
然而,{{1}}完全相同,质量很差,而不是
不符合的。