最大的整数,可以存储在一个双

什么是最大的“无浮动”整数,可以存储在一个IEEE 754双精度型而不失精度?

可以存储在double中的最大/最大整数不会丢失精度,这与double的最大可能值相同。 也就是说, DBL_MAX或大约1.8×10 308 (如果你的double是IEEE 754 64位双)。 这是一个整数。 这是完全的代表。 你还想要什么?

继续,问我最大的整数是什么,这样它和所有较小的整数都可以存储在IEEE 64位双精度中,而不会丢失精度。 一个IEEE 64位双有52位的尾数,所以我认为是2 53

  • 2 53 + 1不能被存储,因为开始处的1和结束处的1之间有太多的零。
  • 小于2 53的任何值都可以被存储,52位被明确地存储在尾数中,然后指数实际上给你另一个。
  • 2 53明显可以存储,因为它是2的小功率。

或者另一种看待它的方式:一旦偏差已经从指数中去除了,忽略与该问题无关的符号位,双倍存储的值是2的幂,再加上一个52位的整数乘以2 指数 – 52 。 因此,对于指数52,可以存储从2 52到2 53 – 1的所有值。然后用指数53,可以在2 53之后存储的下一个数字是2 53 + 1×2 53 – 52 。 所以精度损失首先发生在2 53 + 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位,符号位为1。

2 ^ 53刚过9 * 10 ^ 15。

IEEE 754 double(64-bit)中可以表示的最大整数与该types可以表示的最大值相同,因为该值本身就是一个整数。

这表示为0x7FEFFFFFFFFFFFFF ,它由以下部分组成:

  • 符号位0(正)而不是1(负)
  • 最大指数0x7FE (2046表示减去偏差后的1023)而不是0x7FF (2047表示NaN或无穷大)。
  • 最大尾数0xFFFFFFFFFFFFF是52位全1。

在二进制中,值是隐式1,尾数是52,然后是971个零(1023-52 = 971)。

确切的十进制值是:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

这大约是1.8×10 308

你需要看尾数的大小。 一个IEEE 754 64位浮点数(有52位,加上1表示)可以精确地表示整数的绝对值小于或等于2 ^ 53。

来自<float.h> DECIMAL_DIG应至less给出一个合理的近似值。 既然这是处理十进制数字,而且它确实存储在二进制文件中,你可能会存储一些更大的东西,而不会失去精度,但究竟有多less是不好说的。 我想你应该能够从DBL_MANT_DIGDBL_MANT_DIG ,但我不确定我是否完全相信结果。