Какое первое значение, при котором 64-разрядное число с плавающей запятой IEEE не может различить два целых числа? - PullRequest
0 голосов
/ 27 декабря 2018

Я рассчитываю на Double (IEEE-совместимый 64-разрядный код с плавающей запятой) для отслеживания некоторых очень больших чисел.Проблема в том, что мне нужно поддерживать единичное разрешение целых чисел (те, которые находятся в одном месте).

Проблема в том, что я знаю, что когда значения IEEE увеличиваются, они уменьшаются в точности.Я уверен, что в какой-то момент мы получим что-то вроде этого:

...
xxxxxxxxxxxxxxxxx04
xxxxxxxxxxxxxxxxx05
xxxxxxxxxxxxxxxxx06
xxxxxxxxxxxxxxxxx08
xxxxxxxxxxxxxxxxx10
...

, где некоторые целые числа не могут быть представлены вообще.Я хочу знать, где эта точка, чтобы я мог защититься от нее, предупредить пользователей или установить политику компании.


Обратите внимание, что я использую числа с плавающей точкой для хорошегопричина;дробная часть также важна для приложения, но она гораздо менее важна, чем целочисленная.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Базовый 64-битный двоичный формат IEEE-754 использует 53-битные значения.Каждое конечное число, которое оно кодирует, имеет вид s F • 2 e , где s (для знака) равен +1 или -1, F (для дробной части) - это номер 53-разрядной двоичной цифры b . bbb bbb (обратите внимание на «.» После первого бита), а e - показатель степени от −1022 до +1023.(Часто числа с плавающей запятой нормализуются , сдвигая биты для перемещения первого 1 бита в ведущее положение b и корректируя показатель степени для компенсации. Для обсуждения представимых значений мыможно игнорировать это; все числа, представимые с ведущим 0, также представимы с ведущим 1, пока показатель степени находится в пределах границ, что и для этого вопроса.)

Это говорит нам обо всем, что необходимо для ответа навопрос.Каждое целое число от 0 до 2 53 -1 представляется в виде +1 • b . bbb bbb • 2 52 для некоторой комбинации значений битов b . bbb bbb .А 2 53 представляется как +1 • 1.000… 000 • 2 53 .Но 2 53 + 1 не может быть представлен, потому что для этого потребуется F в форме 1.000… 0001, где требуется 54 бита (первый для 2 53 и последний для 2 0 ).

После этого 2 53 + 2 представимо, поскольку для охвата его старшего и младшего 1 бита требуется только 53 бита (изОт 2 53 до 2 1 ).Таким образом, при этой величине четные целые числа представимы, а нечетные целые не являются.

Итак, переход от последовательных представимых целых чисел к непредставимым целым выглядит следующим образом:

  • 9 007 199 254 740 919 = 2 53 −3 представимо.
  • 9,007,199,254,740,920 = 2 53 -2 представимо.
  • 9,007,199,254,740,921 = 2 53 -1 представимо.
  • 9,007,199,254,740,922 = 2 53 представимо.
  • 9,007,199,254,740,923 = 2 53 + 1 не представимо.
  • 9,007,199,254,740,924 = 2 53 + 2 представимо.
  • 9,007,199,254,740,925 = 2 53 + 3 не представимо.
  • 9,007,199,254,740,926 = 2 53 + 4 представимо.
0 голосов
/ 27 декабря 2018

Согласно Википедии :

Любое целое число с абсолютным значением меньше 2 24 может быть точно представлено в формате с одинарной точностью, а любое целое число с абсолютным значением менее 2 53 может быть точно представлено в формате двойной точности. Кроме того, может быть представлен широкий диапазон степеней, в два раза превышающий такое число.Эти свойства иногда используются для чисто целочисленных данных, чтобы получить 53-разрядные целые числа на платформах, которые имеют числа с плавающей запятой двойной точности, но только 32-разрядные целые числа.

Другими словами, наибольшее значение целочисленной точности для 64-разрядного кода IEEE составляет 9,007,199,254,740,992 , при этом следующим самым высоким числом является 9,007,199,254,740,994.В формате вашего вопроса:

9007199254740990
9007199254740991
9007199254740992
9007199254740992
9007199254740994
9007199254740996
9007199254740996

Обратите внимание, что некоторые алгоритмы с плавающей запятой выводят это как:

9007199254740990.0
9007199254740991.0
9007199254740992.0
9007199254740992.0
9.007199254740994e+15
9.007199254740996e+15
9.007199254740996e+15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...