самое большое целое число, которое может быть сохранено в двойном

LinqPad является большим для тестирования linq к objects/xml/sql. Бесплатная загрузка.

208
задан legends2k 19 June 2014 в 00:40
поделиться

6 ответов

Наибольшее / наибольшее целое число, которое может быть сохранено в double без потери точности, совпадает с наибольшим возможным значением числа double. То есть DBL_MAX или приблизительно 1,8 × 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 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 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 плюс 52-битное целое число, умноженное на 2 экспонента - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.

    и игнорируя знаковый бит как не имеющий отношения к вопросу, значение, сохраненное двойным числом, является степенью 2 плюс 52-битовое целое число, умноженное на 2 экспонента - 52 . Таким образом, с показателем 52 вы можете сохранить все значения от 2 52 до 2 53 -1. Затем с показателем 53 следующее число вы можете сохранить после 2 53 равно 2 53 + 1 × 2 53–52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.

    следующее число, которое вы можете сохранить после 2 53 , будет 2 53 + 1 × 2 53 - 52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.

    следующее число, которое вы можете сохранить после 2 53 , будет 2 53 + 1 × 2 53 - 52 . Таким образом, потеря точности сначала происходит с 2 53 + 1.

    477
    ответ дан 23 November 2019 в 04:39
    поделиться

    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
    
    70
    ответ дан 23 November 2019 в 04:39
    поделиться

    Википедия говорит об этом в том же контексте со ссылкой на IEEE 754 :

    В типичной компьютерной системе «двойная точность» (64-битная ) двоичное число с плавающей запятой имеет коэффициент 53 бита (один из которых подразумевается), показатель степени 11 бит и бит одного знака.

    2 ^ 53 чуть больше 9 * 10 ^ 15.

    25
    ответ дан 23 November 2019 в 04:39
    поделиться

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

    8
    ответ дан 23 November 2019 в 04:39
    поделиться
    5
    ответ дан 23 November 2019 в 04:39
    поделиться

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

    2
    ответ дан 23 November 2019 в 04:39
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: