Какое самое большое "неплавающее" целое число, которое может быть сохранено в двойном типе IEEE 754 без потери точности?
Самое большое целое число, которое может быть сохранено в двойном
Ответ 1
Самое большое/наибольшее целое число, которое может быть сохранено в double без потери точности, совпадает с наибольшим возможным значением double. То есть DBL_MAX
или приблизительно 1,8 & times; × 10 308 (если ваш double является 64-битным двоичным кодом IEEE 754). Это целое число. Это точно. Что еще вы хотите?
Продолжайте, спросите меня, что такое наибольшее целое число, так что он и все меньшие целые числа могут быть сохранены в 64-битных битах IEEE без потери точности. 64-битный бит IEEE имеет 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.
Ответ 2
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
Ответ 3
В Википедии есть что сказать в том же контексте со ссылкой на IEEE 754:
В типичной компьютерной системе двоичное число с плавающей запятой с двойной точностью (64-разрядное) имеет коэффициент 53 бит (один из которых подразумевается), показатель 11 бит и один знаковый бит.
2 ^ 53 находится чуть выше 9 * 10 ^ 15.
Ответ 4
Наибольшее целое число, которое может быть представлено в двойном (64-разрядном) IEEE 754, совпадает с наибольшим значением, которое может представлять тип, поскольку это значение само является целым числом.
Это представлено как 0x7FEFFFFFFFFFFFFF
, состоящее из:
- Знаковый бит 0 (положительный), а не 1 (отрицательный)
- Максимальный показатель
0x7FE
(2046, который представляет 1023 после смещения, вычитается), а не0x7FF
(2047, который указывает aNaN
или бесконечность). - Максимальная мантисса
0xFFFFFFFFFFFFF
, которая составляет 52 бита всего 1.
В двоичном выражении значение является неявным 1, за которым следуют еще 52 единицы из мантиссы, а затем 971 нуль (1023 - 52 = 971) из показателя.
Точное десятичное значение:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
Это примерно 1,8 х 10 308.
Ответ 5
Вам нужно посмотреть размер мантиссы. Число 64-разрядных чисел с плавающей запятой IEEE 754 (имеющее 52 бита плюс 1 подразумеваемый) может точно представлять целые числа с абсолютным значением, меньшим или равным 2 ^ 53.
Ответ 6
1.7976931348623157 × 10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
Ответ 7
DECIMAL_DIG
от <float.h>
должен дать хотя бы разумное приближение этого. Поскольку это имеет дело с десятичными цифрами и действительно хранится в двоичном формате, вы, вероятно, можете хранить что-то немного больше, не теряя точности, но точно, насколько сложно сказать. Я полагаю, вы должны понять это из FLT_RADIX
и DBL_MANT_DIG
, но я не уверен, что полностью верю в результат.