Какое наименьшее (отрицательное) целочисленное значение может быть точно представлено типом Double во всех основных системах x86? - PullRequest
1 голос
/ 10 сентября 2010

Какое наименьшее (отрицательное) целочисленное значение, которое может быть точно представлено типом Double во всех основных системах x86?Особенно в (одновременно) JVM, MySQL, MS SQL Server, .Net, PHP, Python и JavaScript (независимо от того, какой соответствующий тип он использует).

Причина, по которой я спрашиваю об этом, заключается в том, что я хотел бы выбратьзначение, используемое для представления ошибки (для возврата из функции в случае, если она не может быть успешно рассчитана) - поэтому мне нужно точное значение, чтобы быть на 100% предсказуемым для точных проверок на равенство.Кажется, что исключения (try-catch) работают намного медленнее, поэтому мне нужна такая вещь.

Ответы [ 3 ]

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

double (согласно IEEE 754) имеет 52-битную мантиссу + 1 старший значащий бит мантиссы, не представленный в формате iself (поскольку этот бит всегда == 1 для нормализованных чисел).
Таким образом, max int точно представлен как double (2 ^ 53-1), а min один - (2 ^ 53-1), около + - 8 квадриллионов (или бильярдов в системе длинных номеров)

0 голосов
/ 23 июня 2012

В писк Smalltalk у нас есть этот метод

maxExactInteger
    "Answer the biggest integer such that it is exactly represented in a float, and all smaller integers also are"
    ^1 bitShift: self precision

, где точность равна 53 для двойного (53-битный мантисса с включенным подразумеваемым).Да, конечно, 2 ^ 53 представляется точно, и все меньшие положительные целые числа тоже, но 2 ^ 53 + 1 нет, это потребовало бы 54 бита, и было бы округлено до 2 ^ 53 ...

То же самое для негативов, наименьшее - -2 ^ 53 (в представлении с плавающей точкой IEEE 754 нет трюка с 2-мя дополнениями, только знаковый бит).

0 голосов
/ 11 сентября 2010

Большинство ваших языков и продуктов баз данных будут использовать стандарт IEEE 754 в одиночном и парном разрядах. В C и C ++ вы можете использовать одиночные расширенные форматы и двойные расширенные форматы, но это форматы, зависящие от архитектуры. Ваши высокоуровневые, независимые от платформы языки и базы данных, вероятно, избегают их разоблачения.

Согласно стандарту IEEE 754, вы игнорируете, что двойник может хранить бесконечность, бесконечность и NaN, тогда:

  • Макс. Нормальное число: 1.7976931348623157e + 308
  • мин положительное нормальное число: 2.2250738585072014e-308
  • Макс. Субнормальное число: 2.2250738585072009e-308
  • мин положительное субнормальное число: 4,9406564584124654e-324

Для двойного расширенного формата x86:

  • Макс. Норм. 1,18973149535723176505e + 4932
  • мин. Положительная норма: 3.36210314311209350626e-4932
  • Макс субнормальный: 3.36210314311209350608e-4932
  • мин положительное субнормальное: 3,64519953188247460253e-4951

Это получается, что двойной имеет:

  • Значимые цифры (двоичные): 53
  • Наименьшее положительное нормальное число: 2,225 ... 10 -308
  • Наибольшее положительное число 1.797 ... 10 308
  • Значимые цифры (десятичные): 15-17

И двойной расширенный (x86) имеет:

  • Значимые цифры (двоичные): 64
  • Наименьшее положительное нормальное число: 3,342 ... 10 -4932
  • Наибольший положительный номер 1.189 ... 10 4932
  • Значимые цифры (десятичные): 18-21
...