可以存储在 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的绝对值整数。

DECIMAL_DIG <float.h>应该给至少一个合理的近似。由于与十进制数字交易,而且它确实存储在二进制,你也许可以存放东西的的更大的不失精确,但到底有多少还很难说。我想你应该能够从FLT_RADIXDBL_MANT_DIG看着办吧,但我不知道我完全信任的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top