32

可能重复:
long double vs double

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

4

3 回答 3

48

引用 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它的表示占用至少与 一样多的内存,float并且long double至少与 一样多double。额外的内存用于更精确地表示数字。

在 x86 系统上,float通常是 4 字节长,可以存储大约 3×10³⁸ 和 1.4×10⁻⁴⁵ 的数字。它是一个 IEEE 754单精度数,存储大约 7 个小数位的小数。

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

该标准只要求它long double至少与. 但是,在大多数 x86 芯片上,10 字节扩展精度格式的 80 位数字可通过 CPU 的浮点单元获得,它提供比 64 位更高的精度,精度约为 21 位十进制数字。doublelong doubledoubledouble

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

于 2013-01-08T18:43:56.043 回答
18

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

int main() { 
    printf("%d\n", sizeof(double)); // some compilers print 8
    printf("%d\n", sizeof(long double)); // some compilers print 16
    return 0;
}
于 2013-01-08T18:37:05.067 回答
10

取决于编译器,数据long <type>类型可能比数据类型拥有更大的值。<type>

于 2013-01-08T18:38:13.503 回答