了解 DBL_MAX
Understanding DBL_MAX
我刚刚了解到 IEEE 754 standard in order to understand how single-precision and double-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
的 exact 值是:
(2^53-1)*(2^(1023-52))
(正如预期的那样,它略小于 2^10,因为尾数略小于 2)
DBL_MAX
是 double 可以容纳的最大 value。它的值与尾数的位数无关。
限制主要与最大指数有关。对于 IEEE-754,它大约是 1.8e+308 或 2^1023。
定义通常是#define DBL_MAX 1.79769313486231470e+308
双精度表示为 m*2^e
,其中 m
是尾数,e
是指数。双打有 11 位的指数。由于指数可以为负,因此存在 1023
的偏移量。也就是说真正的计算是m*2^(e-1023)
。最大的11位数是2047
。指数 2047
保留用于存储 inf
和 NaN
。这意味着最大的 double 是 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
的标准值。
我刚刚了解到 IEEE 754 standard in order to understand how single-precision and double-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
的 exact 值是:
(2^53-1)*(2^(1023-52))
(正如预期的那样,它略小于 2^10,因为尾数略小于 2)
DBL_MAX
是 double 可以容纳的最大 value。它的值与尾数的位数无关。
限制主要与最大指数有关。对于 IEEE-754,它大约是 1.8e+308 或 2^1023。
定义通常是#define DBL_MAX 1.79769313486231470e+308
双精度表示为 m*2^e
,其中 m
是尾数,e
是指数。双打有 11 位的指数。由于指数可以为负,因此存在 1023
的偏移量。也就是说真正的计算是m*2^(e-1023)
。最大的11位数是2047
。指数 2047
保留用于存储 inf
和 NaN
。这意味着最大的 double 是 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
的标准值。