C ++打印DBL_MAX

时间:2014-11-10 21:34:07

标签: c++ double max cout

如果以前曾经问过这个问题,我很抱歉,但是我读了很多DBL_MAX线程并没有看到这个确切的问题。

在我的float.h标题中,变量定义为

#define DBL_MAX         1.7976931348623158e+308 /* max value */

但是,每当我尝试在控制台中打印时,我最终会得到1.797693134862315 7 e + 308。

如果这应该是最大可表示值,那么它是否应该正确打印,而不是向下舍入?我还将out.precision设置为双精度的最大值。

任何人都可以解释为什么会这样,并建议是否有办法打印DBL_MAX不变?

1 个答案:

答案 0 :(得分:1)

你在两端都得到了正确的行为。

您的系统似乎使用的所谓binary64 double表示中可表示的最大值的指数为1023,并且分数为1 - 2 -52 ,给(1 + 1-2 -52 )* 2 1023 =(2 1 + 52 -2 -52 +52 )* 2 1023-52 =(2 53 -1)* 2 971 ,根据{{1完全评估

$ bc <<< '(2 ^ 53 - 1) * (2 ^ 971)'
17976931348623157081452742373170435679807056752584499659891747680315\
72607800285387605895586327668781715404589535143824642343213268894641\
82768467546703537516986049910576551282076245490090389328944075868508\
45513394230458323690322294816580855933212334827479782620414472316873\
8177180919299881250404026184124858368

正如您所看到的,这是bc,它比1.797693134862315708...e+308更接近1.7976931348623157e+308,这解释了为什么您在{1.7976931348623158e+308之前看到7 1}}打印此号码时。

但是,标头中的常量的目的略有不同:其目的是始终,无论编译器如何配置,都要给出精确的浮点数。将常量定义为e将是不正确的,因为该数字不能完全表示,编译器被强制舍入到前一个或下一个可表示的浮点值,并且编译器可能是被配置为向下舍入。将常量定义为1.7976931348623157e+308没有那个问题,因为它不允许编译器向上舍入,因为没有下一个(有限)值。