DBL_MAX的类型

我在某处看到了这段代码

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

演员是必要的吗? 我在标准中找不到任何指定DBL_MAX必须实际拥有(或提升)类型为double

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

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

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

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

我不相信标准中有任何东西真的说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 ,它会违反直觉,但我认为标准中没有要求它会违反。