在我的 32 位机器(具有 Intel T7700 双核)上,C 语言的双精度型和长双精度型都有 15 位精度数字。我比较了 long double 的参数 LDBL_DIG 和 double 的 DBL_DIG 参数,它们都是 15。我使用 MVS2008 得到了这些答案。我想知道这些结果是否取决于编译器,或者它们仅取决于我的处理器?
某些编译器支持 long double 格式,其精度比 double 更高。 Microsoft MSVC 不是其中之一。 如果 15 位有效数字还不够好,那么您很可能一开始就不应该使用浮点类型。 检查此线程是否有任意精度库。
它们有可能依赖于编译器,但一般来说,它们只依赖于体系结构。 特别是,如果编译器使用相同的包含文件,则这些文件可能不会有所不同。 如果您想编写可移植的代码,最好检查一下它们以确保安全。
对。这些是依赖于实现的。 C 标准的唯一保证是:
float
是 double
的子集,double
是 long double
的子集 (6.2.5/10)FLT_RADIX ≥ 2
(5.2.4.2.2/9)FLT_DIG ≥ 6, DBL_DIG ≥ 10, LDBL_DIG ≥ 10
FLT_MIN_10_EXP, DBL_MIN_10_EXP LDBL_MIN_10_EXP ≤ -37
FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP ≥ +37
FLT_MAX, DBL_MAX, LDBL_MAX ≥ 1e+37
(5.2.4.2.2/10)FLT_EPSILON ≤ 1e-5, DBL_EPSILON ≤ 1e-9, LDBL_EPSILON ≤ 1e-9
(5.2.4.2.2/11)FLT_MIN, DBL_MIN, LDBL_MIN ≤ 1e-37
处理
long double = double
是 C 标准允许的。
虽然 C 标准不要求这样做,但它强烈建议
float
和 double
分别是标准 IEEE 754 单精度和双精度浮点类型。它们位于任何支持它们的硬件架构上(这意味着几乎无处不在)。
long double
的事情稍微棘手一些,因为没有多少架构支持高于双精度的浮点类型。标准要求 long double
的范围和精度至少与 double
一样多。这意味着如果架构不再支持任何内容,则 long double
类型与 double
相同。即使它确实(如x87),一些编译器仍然使
long double
等同于double
(如M$VC),而其他编译器将扩展精度类型公开为long double
(如Borland和GCC)。即使编译器公开了扩展精度类型,对于“扩展精度”的确切含义仍然没有标准。在 x87 上,这是 80 位。其他一些架构具有 128 位四精度类型。即使在 x87 上,一些编译器也有
sizeof(long double)
= 10,而其他编译器则将其填充以进行对齐,以便它是 12 或 16(如果
long double
是 double
,则为 8)。所以底线是,
long double
的实现因平台而异。您唯一可以确定的是,它
至少相当于
double
。如果您想编写可移植代码,请不要依赖其表示形式 - 使其远离接口和二进制 I/O。不过,在程序的内部计算中使用 long double
是可以的。