C和C ++中long double和double的区别

可能重复:
长双和双

我是编程新手,我无法理解C和C ++中long double和double之间的区别。 我试图谷歌它,但无法理解它,并感到困惑。 谁能请帮忙。

引用C ++标准,§3.9.1¶8:

有三种浮点类型:float,double和long double。 double类型提供至少与float一样多的精度,long double类型提供至少与double一样多的精度。 float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集。 浮点类型的值表示是实现定义的。 积分和浮动类型统称为算术类型。 标准模板std :: numeric_limits(18.3)的特化应指定实现的每种算术类型的最大值和最小值。

也就是说, double表示其表示的内存至少与floatlong double至少与long double一样多。 额外的内存用于更精确地表示数字。

在x86系统上, float通常为4个字节,可以存储大约3×10 3的数字,大约只有1.4×10 -6。 它是IEEE 754 单精度数 ,可存储小数的7位十进制数。

同样在x86系统上, double是8字节长,可以存储IEEE 754 双精度格式的数字,该格式具有更大的范围并存储更精确的数字,大约15个十进制数字。 在某些其他平台上, double可能不是8个字节长,并且可能确实与单精度float

标准只要求long double至少与double一样精确,因此一些编译器只会将long double视为long double ,就好像它是double 。 但是,在大多数x86芯片上,10位字节扩展精度格式 80位数可通过CPU的浮点单元获得,它提供比64位double精度更高的精度,精度约为21位小数。

有些编译器支持16字节(128位)IEEE 754 四倍精度数字格式,具有更精确的表示和更大的范围。

这取决于您的编译器,但以下代码可以显示每种类型所需的字节数:

 int main() { printf("%d\n", sizeof(double)); // some compilers print 8 printf("%d\n", sizeof(long double)); // some compilers print 16 return 0; } 

long 数据类型可以包含比数据类型更大的值,具体取决于编译器。