双精度的 C 精度:依赖于编译器?

问题描述 投票:0回答:5

在我的 32 位机器(具有 Intel T7700 双核)上,C 语言的双精度型和长双精度型都有 15 位精度数字。我比较了 long double 的参数 LDBL_DIG 和 double 的 DBL_DIG 参数,它们都是 15。我使用 MVS2008 得到了这些答案。我想知道这些结果是否取决于编译器,或者它们仅取决于我的处理器?

c precision
5个回答
1
投票

某些编译器支持 long double 格式,其精度比 double 更高。 Microsoft MSVC 不是其中之一。 如果 15 位有效数字还不够好,那么您很可能一开始就不应该使用浮点类型。 检查此线程是否有任意精度库。


1
投票

它们有可能依赖于编译器,但一般来说,它们只依赖于体系结构。 特别是,如果编译器使用相同的包含文件,则这些文件可能不会有所不同。 如果您想编写可移植的代码,最好检查一下它们以确保安全。


1
投票

对。这些是依赖于实现的。 C 标准的唯一保证是:

  1. float
    double
    的子集,
    double
    long double
    的子集 (6.2.5/10)
  2. FLT_RADIX ≥ 2
    (5.2.4.2.2/9)
  3. FLT_DIG ≥ 6, DBL_DIG ≥ 10, LDBL_DIG ≥ 10
  4. FLT_MIN_10_EXP, DBL_MIN_10_EXP LDBL_MIN_10_EXP ≤ -37
  5. FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP ≥ +37
  6. FLT_MAX, DBL_MAX, LDBL_MAX ≥ 1e+37
    (5.2.4.2.2/10)
  7. FLT_EPSILON ≤ 1e-5, DBL_EPSILON ≤ 1e-9, LDBL_EPSILON ≤ 1e-9
    (5.2.4.2.2/11)
  8. FLT_MIN, DBL_MIN, LDBL_MIN ≤ 1e-37

处理

long double = double
是 C 标准允许的。


1
投票

虽然 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
是可以的。
    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.