我在某处看到了这段代码
printf("DBL_MAX : %g\n", (double) DBL_MAX);
演员是否必要?我在标准中找不到任何指定DBL_MAX
必须实际拥有(或促销)类型double
的内容。
答案 0 :(得分:4)
DBL_MAX
被指定为宏,因此本身没有类型。
1999 C标准的要求是DBL_MAX
必须扩展到至少1E+37
的常量值,但没有说明它的实际类型。由于它表示double
可以表示的实现定义的最大值,因此逻辑会建议扩展是一个可以转换为double
而无需任何更改(例如精度损失)的值。
此逻辑允许但不要求DBL_MAX
为double
类型。它也可以是long double
类型(因为long double
也可以精确地表示double
可以的所有值。
实际上,很难设想将DBL_MAX
扩展为不是double
类型的常量的实现,而且我当然从未听说过提及一个。但这并不意味着它是必需的。 printf("DBL_MAX : %g\n", (double) DBL_MAX)
提供了一个保守的(在允许允许的情况下,即使可能不会发生)保证将double
类型的值传递给printf()
。 / p>
答案 1 :(得分:3)
我不相信标准中的任何内容确实表明DBL_MAX
是double
类型的表达式。
N1570 5.2.4.2.2p12中指定FLT_MAX
,DBL_MAX
和LDBL_MAX
的说明是:
以下列表中给出的值应替换为常量 实现定义值大于的表达式 或等于显示的那些:
(所有三个必须至少1E+37
)。
就常识问题而言,我认为没有充分理由表达FLT_MAX
,DBL_MAX
和LDBL_MAX
宏扩展而不是分别属于float
,double
和long double
类型。我怀疑该标准的作者只是假设它们是预期的类型。我个人很乐意省略演员并使用DBL_MAX
而不是(double)DBL_MAX
。
如果使用了一个实现:
#define DBL_MAX 1.79769313486231570815e+308L
给它一种long double
,这样会违反直觉,但我认为标准中没有要求它违反。