可以存储在 double 中的最大整数
-
13-09-2019 - |
题
可以存储在 IEEE 754 双精度类型中而不丢失精度的最大“非浮动”整数是多少?
解决方案
可以存储在双精度型中而不丢失精度的最大/最大整数与双精度型的最大可能值相同。那是, DBL_MAX
或大约 1.8 × 10308 (如果您的双精度数是 IEEE 754 64 位双精度数)。它是一个整数。它被准确地表示出来。你还想要什么?
继续,问我最大的整数是多少,这样它 和所有较小的整数 可以以 IEEE 64 位双精度形式存储,而不会损失精度。IEEE 64 位双精度数有 52 位尾数,所以我认为它是 253:
- 253 + 1 无法存储,因为开头的 1 和结尾的 1 之间有太多的零。
- 任何小于 2 的值53 可以存储,52 位显式存储在尾数中,然后指数实际上为您提供了另一个。
- 253 显然可以存储,因为它是 2 的小幂。
或者另一种看待它的方式:一旦消除了指数的偏差,并忽略与问题无关的符号位,则 double 存储的值是 2 的幂,加上 52 位整数乘以 2指数 − 52. 。因此,使用指数 52,您可以存储从 2 开始的所有值52 到 253− 1.然后使用指数 53,您可以在 2 之后存储下一个数字53 是 253 + 1 × 253 − 52. 。所以精度损失首先发生在 253 + 1.
其他提示
<强> 9007199254740992 强>(这是9,007,199,254,740,992),没有保证:)
程序
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
结果
9007199254740991 9007199254740992 9007199254740992
维基百科有这对在相同上下文中说以链接到 IEEE 754 :
在一个典型的计算机系统中,“双精度”(64位)二进制浮点数具有53个比特的系数(其中一个被隐含),11位指数和一个符号位。
2 ^ 53是刚刚超过9×10 ^ 15
IEEE 754 double(64 位)中可以表示的最大整数与该类型可以表示的最大值相同,因为该值本身就是一个整数。
这表示为 0x7FEFFFFFFFFFFFFF
, ,它由以下部分组成:
- 符号位 0(正)而不是 1(负)
- 最大指数
0x7FE
(2046 代表减去偏差后的 1023)而不是0x7FF
(2047 表示NaN
或无穷大)。 - 最大尾数
0xFFFFFFFFFFFFF
即52位全1。
在二进制中,该值是隐式 1,后跟尾数中的另外 52 个 1,然后是指数中的 971 个零 (1023 - 52 = 971)。
精确的十进制值为:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
这大约是 1.8 x 10308.
您需要看尾数的大小。一个IEEE 754 64位浮点数(其具有52位,外加1暗示)可以精确地表示具有小于或等于2 ^ 53的绝对值整数。
1.7976931348623157×10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
这DECIMAL_DIG
<float.h>
应该给至少一个合理的近似。由于与十进制数字交易,而且它确实存储在二进制,你也许可以存放东西的小的更大的不失精确,但到底有多少还很难说。我想你应该能够从FLT_RADIX
和DBL_MANT_DIG
看着办吧,但我不知道我完全信任的结果。