самое большое целое число, которое может быть сохранено в двойнике
каково самое большое" не плавающее " целое число, которое может храниться в двойном типе IEEE 754 без потери точности ?
7 ответов:
самое большое / самое большое целое число, которое может быть сохранено в двойнике без потери точности, совпадает с максимально возможным значением двойника. То есть,
DBL_MAX
или примерно 1,8 × 10308 (Если ваш двойник является 64-разрядным двойником IEEE 754). Это целое число. Он представлен точно. Чего еще ты хочешь?продолжайте, спросите меня, какое самое большое целое число, такое, что оно и все меньшие целые числа может храниться в IEEE 64-битных двойников без потери точность. В 64-битном двойнике IEEE есть 52 бита мантиссы, поэтому я думаю, что это 253:
- 253 + 1 не может быть сохранен, потому что 1 в начале и 1 в конце имеют слишком много нулей между ними.
- что-нибудь меньше 253 может быть сохранен, с 52 битами, явно сохраненными в мантиссе, а затем экспонента, по сути, дает вам еще один.
- 253 очевидно, могут быть сохранены, так как это небольшая мощность 2.
или другой способ взглянуть на это: как только смещение было снято с экспоненты и игнорирует знаковый бит как не относящийся к вопросу, значение, хранящееся в double, является степенью 2, плюс 52-битное целое число, умноженное на 2показатель - 52. Таким образом, с экспонентой 52 вы можете хранить все значения от 252 до 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
Википедия имеет это сказать в том же контексте со ссылкой на 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 единицы из мантиссы, а затем 971 нуль (1023 - 52 = 971) из экспоненты.
точное десятичное значение это:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
Это примерно 1,8 х 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>
должны дать, по крайней мере разумное приближение этого. Поскольку это касается десятичных цифр, и это действительно хранится в двоичном формате, вы, вероятно, можете хранить что-то a мало больше, не теряя точности, но точно, сколько трудно сказать. Я полагаю, вы должны быть в состоянии понять это изFLT_RADIX
иDBL_MANT_DIG
, но я не уверен, что полностью доверять результату.