DBL_MAX的类型

时间:2017-01-31 05:58:07

标签: c floating-point language-lawyer

我在某处看到了这段代码

printf("DBL_MAX     :   %g\n", (double) DBL_MAX);

演员是否必要?我在标准中找不到任何指定DBL_MAX必须实际拥有(或促销)类型double的内容。

2 个答案:

答案 0 :(得分:4)

DBL_MAX被指定为宏,因此本身没有类型。

1999 C标准的要求是DBL_MAX必须扩展到至少1E+37的常量值,但没有说明它的实际类型。由于它表示double可以表示的实现定义的最大值,因此逻辑会建议扩展是一个可以转换为double而无需任何更改(例如精度损失)的值。

此逻辑允许但不要求DBL_MAXdouble类型。它也可以是long double类型(因为long double也可以精确地表示double可以的所有值。

实际上,很难设想将DBL_MAX扩展为不是double类型的常量的实现,而且我当然从未听说过提及一个。但这并不意味着它是必需的。 printf("DBL_MAX : %g\n", (double) DBL_MAX)提供了一个保守的(在允许允许的情况下,即使可能不会发生)保证将double类型的值传递给printf()。 / p>

答案 1 :(得分:3)

我不相信标准中的任何内容确实表明DBL_MAXdouble类型的表达式。

N1570 5.2.4.2.2p12中指定FLT_MAXDBL_MAXLDBL_MAX的说明是:

  

以下列表中给出的值应替换为常量   实现定义值大于的表达式   或等于显示的那些:

(所有三个必须至少1E+37)。

就常识问题而言,我认为没有充分理由表达FLT_MAXDBL_MAXLDBL_MAX宏扩展而不是分别属于floatdoublelong double类型。我怀疑该标准的作者只是假设它们是预期的类型。我个人很乐意省略演员并使用DBL_MAX而不是(double)DBL_MAX

如果使用了一个实现:

#define DBL_MAX 1.79769313486231570815e+308L

给它一种long double,这样会违反直觉,但我认为标准中没有要求它违反。