如果以前曾经问过这个问题,我很抱歉,但是我读了很多DBL_MAX线程并没有看到这个确切的问题。
在我的float.h
标题中,变量定义为
#define DBL_MAX 1.7976931348623158e+308 /* max value */
但是,每当我尝试在控制台中打印时,我最终会得到1.797693134862315 7 e + 308。
如果这应该是最大可表示值,那么它是否应该正确打印,而不是向下舍入?我还将out.precision
设置为双精度的最大值。
任何人都可以解释为什么会这样,并建议是否有办法打印DBL_MAX
不变?
答案 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
没有那个问题,因为它不允许编译器向上舍入,因为没有下一个(有限)值。