самое большое целое число, которое можно сохранить в формате типа double

StackOverflow https://stackoverflow.com/questions/1848700

Вопрос

Какое самое большое «неплавающее» целое число, которое можно сохранить в двойном типе IEEE 754 без потери точности?

Это было полезно?

Решение

Самое большое/самое большое целое число, которое можно сохранить в двойном числе без потери точности, совпадает с максимально возможным значением двойного значения.То есть, DBL_MAX или примерно 1,8 × 10308 (если ваш двойник является 64-битным двойником IEEE 754).Это целое число.Это представлено точно.Что вы еще хотите?

Давай, спроси меня, какое самое большое целое число такое, что оно и все меньшие целые числа могут храниться в 64-битных двойных файлах IEEE без потери точности.64-битный номер IEEE имеет 52 бита мантиссы, поэтому я думаю, что это 2.53:

  • 253 +1 нельзя сохранить, потому что между 1 в начале и 1 в конце слишком много нулей.
  • Все, что меньше 253 можно сохранить, при этом 52 бита явно сохраняются в мантиссе, а затем показатель степени фактически дает вам еще один.
  • 253 очевидно, можно сохранить, поскольку это малая степень двойки.

Или другой взгляд на это:после того, как смещение было снято с экспоненты и игнорировался знаковый бит как не имеющий отношения к вопросу, значение, сохраненное как двойное значение, представляет собой степень 2 плюс 52-битное целое число, умноженное на 2показатель − 52.Таким образом, с показателем 52 вы можете хранить все значения, начиная с 2.52 до 253− 1.Затем с показателем 53 следующее число, которое вы можете сохранить после 253 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

В Википедии об этом говорится в том же контексте со ссылкой на ИЭЭЭ 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 единицы от мантиссы, затем 971 ноль (1023 – 52 = 971) от показателя степени.

Точное десятичное значение:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

Это примерно 1,8 х 10.308.

Нужно смотреть на размер мантиссы.64-битное число с плавающей запятой IEEE 754 (которое имеет 52 бита плюс 1 подразумеваемый) может точно представлять целые числа с абсолютным значением меньше или равным 2^53.

DECIMAL_DIG от <float.h> должно дать хотя бы разумное приближение к этому.Поскольку речь идет о десятичных цифрах и на самом деле они хранятся в двоичном формате, вы, вероятно, можете сохранить что-то в виде маленький больше без потери точности, но насколько точно сказать трудно.Полагаю, вы сможете это понять из FLT_RADIX и DBL_MANT_DIG, но я не уверен, что полностью доверяю результату.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top