gpt4 book ai didi

c - 了解 DBL_MAX

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

我刚刚读到有关 IEEE 754 的信息标准以了解如何single-precisiondouble-precision实现了 float 。

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

#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)

最佳答案

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

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

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

关于c - 了解 DBL_MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064616/

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