【发布时间】:2015-05-10 07:21:27
【问题描述】:
我刚刚阅读了IEEE 754 标准,以了解single-precision 和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 的准确值是:
(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