gpt4 book ai didi

C++ 打印 DBL_MAX

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:24 26 4
gpt4 key购买 nike

如果之前有人问过这个问题,我深表歉意,但我通读了许多 DBL_MAX 线程,但没有看到这个确切的问题。

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

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

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

如果这应该是最大可表示值,它不应该在不向下舍入的情况下正确打印吗?我还将 out.precision 设置为 double 的最大值。

谁能解释为什么会这样,并建议是否有办法打印出 DBL_MAX 不变?

最佳答案

两端的行为都是正确的。

所谓binary64中可表示的最大值您的系统似乎使用的 double 表示具有 1023 的指数和 1 - 2-52 的分数,给出 (1 + 1-2- 52)*21023 = (21+52-2-52+52)*21023- 52 = (253-1)*2971,根据 bc 计算为 exactly

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

如您所见,这是 1.797693134862315708...e+308,它比 1.7976931348623158e+ 更接近 1.7976931348623157e+308 308,这解释了为什么在打印此数字时您会在 e 之前看到 7

但是, header 中的常量有一个稍微不同的目的:它的目的是始终提供准确的 float ,无论编译器是如何配置的。将常量定义为 1.7976931348623157e+308 是不正确的,因为该数字不能准确表示,编译器被迫四舍五入到前一个或下一个可表示的浮点值,并且有可能编译器配置为向下舍入。将常量定义为 1.7976931348623158e+308 没有这个问题,因为它不允许编译器向上舍入,因为没有下一个(有限)值。

关于C++ 打印 DBL_MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26853387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com