【问题标题】:Understanding DBL_MAX了解 DBL_MAX
【发布时间】:2015-05-10 07:21:27
【问题描述】:

我刚刚阅读了IEEE 754 标准,以了解single-precisiondouble-precision 浮点是如何实现的。

所以我写了这个来检查我的理解:

#include <stdio.h>
#include <float.h>

int main() {
    double foo = 9007199254740992; // 2^53
    double bar = 9007199254740993; // 2^53 + 1

    printf("%d\n\n", sizeof(double)); // Outputs 8. Good
    printf("%f\n\n", foo); // 9007199254740992.000000. Ok
    printf("%f\n", bar); // 9007199254740992.000000. Ok because Mantissa is 52 bits
    printf("%f\n\n", DBL_MAX); // ??

    return 0;
}

输出:

8

9007199254740992.000000

9007199254740992.000000

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

我不明白的是,我希望输出的最后一行是:(2^53-1) * 2^(1024-52),但最后一行的数字大约对应于 2^ (2^10)。我错过了什么? DBL_MAX到底是怎么计算出来的?

编辑:关于DBL_MAX确切值的一点解释:

正如在接受的答案中所解释的,指数的最大值是 2^1023 而不是我认为的 2^1024。所以DBL_MAX准确值是: (2^53-1)*(2^(1023-52))(正如预期的那样,它略小于 2^10,因为尾数略小于 2)

【问题讨论】:

  • %d 需要int 类型的参数。 sizeof 产生一个 size_t 类型的值。使用%zu 打印它:printf("%zu\n", sizeof(double));。使用%d 可能会起作用,具体取决于您的系统特性,但它并不可靠。
  • 是的,你是对的。那只是为了测试:)

标签: c floating-point double double-precision


【解决方案1】:

Double 表示为m*2^e,其中m 是尾数,e 是指数。双打有 11 位的指数。由于指数可以是负数,因此偏移量为1023。这意味着真正的计算是m*2^(e-1023)。最大的 11 位数字是2047。指数2047 保留用于存储infNaN。这意味着最大的双倍是m*2^(2046-1023) = m*2^(1023)。尾数是一个介于 1 和 2 之间的数字。这意味着当 m 几乎是 2 时获得最大的双倍。所以我们有:

DBL_MAX = max(m)*2^1023 ~ 2*2^1023 = 2^1024 = 2^(2^10)

如您所见,here 这几乎是DBL_MAX 的标准值。

【讨论】:

  • 是啊抱歉一定是误删了。
  • 完全正确,但指数偏差为 1023,最大指数为无穷大和 nan 保留,因此 DBL_MAX 的指数为 2046 - 1023 = 1023。
【解决方案2】:

DBL_MAX 是 double 可以容纳的最大 。它的值与尾数的位数无关。

限制主要与最大指数有关。对于 IEEE-754,大约是 1.8e+308 或 2^1023。

定义通常是#define DBL_MAX 1.79769313486231470e+308

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2020-09-18
    相关资源
    最近更新 更多