C 和 C++ 中长双倍和双精度的区别

Difference between long double and double in C and C++

本文关键字:双精度 区别 C++      更新时间:2023-10-16

可能的重复项:
长双与双

我是编程新手,无法理解 C 和 C++ 中长双精度和双精度之间的区别。我试图谷歌它,但无法理解它并感到困惑。任何人都可以帮忙。?

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

有三种浮点类型:浮点型、双精度型和长型双精度型。双精度型至少提供与浮点数一样多的精度,而长型双精度型提供的精度至少与双精度一样多。浮点型的值集是双精度类型的值集的子集;双精度类型的值集是长双精度类型的值集的子集。浮点类型的值表示形式是实现定义的。整型和浮点型统称为算术类型。标准模板 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至少与double一样精确,所以有些编译器会简单地将long double视为与double相同。但是,在大多数x86芯片上,10字节扩展精度格式80位数字可以通过CPU的浮点单元获得,它提供比64位double更高的精度,精度约为21个十进制数字。

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

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

int main() { 
    printf("%dn", sizeof(double)); // some compilers print 8
    printf("%dn", sizeof(long double)); // some compilers print 16
    return 0;
}
long <type>数据类型可能

<type>数据类型保存更大的值,具体取决于编译器。