我在某处看到了这段代码
printf("DBL_MAX : %gn", (double) DBL_MAX);
演员是必要的吗? 我在标准中找不到任何指定DBL_MAX
必须实际拥有(或提升)类型为double
。
DBL_MAX
被指定为宏,因此本身没有类型。
1999 C标准的要求是DBL_MAX
必须扩展到一个至少为1E+37
的恒定值,但没有说明它的实际类型。 由于它表示double
可以表示的实现定义的最大值,因此逻辑会建议扩展是一个可以转换为double
而无需任何更改(例如精度损失)的值。
此逻辑允许但不要求DBL_MAX
为double
类型。 它也可以是long double
类型(因为它还需要long double
可以精确地表示long double
可以的所有值)。
实际上,很难设想一个DBL_MAX
扩展为不是double
类型的常量的实现,而且我当然从未听说过一个。 但这并不意味着它是必需的。 printf("DBL_MAX : %gn", (double) DBL_MAX)
提供了一个保守的(在为允许的可能性提供的意义上,即使它可能不会发生)也保证传递double
类型的值printf()
。
我不相信标准中有任何东西真的说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
,它会违反直觉,但我认为标准中没有要求它会违反。
以上就是c/c++开发分享DBL_MAX的类型相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544610.html