Может ли double представлять все значения, которые может представлять float?
Существуют определенные значения int, которые float не может представлять.
Однако, может ли double представлять все значения, которые может представлять float?
Моя интуиция говорит "да", так как double имеет более дробные биты и больше битов экспоненты, но могут быть некоторые глупые ошибки, которые мне не хватает.
Ответы
Ответ 1
Да.
Вероятно, это поможет узнать, как работают float и double.
Не вдаваясь в подробности...
Возьмите число 152853.5047
(период обращения Юпитера Луны Io в секундах)
В научной нотации это число 0.1528535047 × 10^6
Поскольку компьютеры понимают только 1 и 0, существует способ определить .
Мантисса (1528535047) и экспонента (6) хранятся в 32-битах... если я правильно помню, для мантиссы всего 24 бита, поэтому с плавающей точкой обычно больше точности, чем размер. Чем больше число, тем менее точным оно может быть.
1528535047 = 1011011000110111001100000000111
, так что вы можете хранить только первые 24 бита... последние три 1. отключаются.
Поскольку целые числа являются 32-битными, вы правы, плавающая точка не может точно содержать его. менее значимые цифры теряются с конца.
Любое целое число с абсолютным значением менее 2 ^ 24 (24 бит) может быть сохранено без потери точности. (16777216)
Так биты хранятся в числе с плавающей запятой:
Как float хранит диаграмму http://phimuemue.wordpress.com/files/2009/06/576px-ieee-754-single-svg1.png
источник
Один бит для знака, 8 бит для экспоненты и 23 бит для мантиссы. Поэтому, чтобы ответить на ваш вопрос, поскольку для мантиссы зарезервированы только 23 бит, 32-битное целое число невозможно показать с точностью. Он быстро начнет отсекать номера (справа), так как для отображения требуется больше цифр.
Для двойника вы просто увеличиваете количество бит, которые он может хранить... на самом деле он называется двойной точностью, поэтому любое число, которое может быть показано как float, способно показанный как двойной. Экстра 0 просто добавляются к мантиссе.
По этой причине, поскольку double занимает 64 бита, большинство людей будут использовать double при преобразовании из 32-битного int в double. Поплавок был бы хорош для преобразования 16-битного короткого кода.
Ответ 2
6.2.5/10 в n1256:
Существуют три реальных плавающих типа, обозначенные как плавающие, двойные и длинные двойной. Набор значений type float - это подмножество набора значения типа double; набор значения типа double являются подмножеством множества значений типа long в два раза.
(основное внимание).
Независимо от того, использует ли реализация IEEE754 или нет, стандарт C99 гарантирует то, что вы хотите.
Ответ 3
Да, double может представлять все значения, которые может использовать float.
Вот почему:
Оба числа представлены в виде знака, экспонента и мантиссы. Разница между float и double заключается в том, что для экспоненты и мантиссы больше места.
Для экспоненты более широкий диапазон не представляет проблемы. Вы можете представить все байтовые значения с помощью int, и то же самое верно для экспоненты. Мантисса немного отличается, но если вы заполняете лишние биты двойной мантиссы нулями, вы получите точно такое же значение, как и поплавок.
Это может быть проще понять в десятичной форме: скажем, у вас есть число в десятичном виде:
1,99234
Это число имеет 5 десятичных знаков за запятой. Что бы вы сделали, если бы вам пришлось продлить такое же число до десяти десятичных знаков? Легко: добавьте нули:
1,9923400000
Это точно такое же число, просто представленное с большей точностью в мантиссе.
Ответ 4
Любое число float
может быть представлено как double
. Я не уверен в NaNs. (Я уверен, что вы можете представить float
NaN как double
, добавив лишние нули в значение, но я не уверен, что программное обеспечение или аппаратные средства, которые реагируют на NaN, будут реагировать на такое NaN точно так же.)
Ответ 5
На практике, да. Однако я сомневаюсь, что это требуется по стандарту. Если платформа с 64-разрядным int
(AFAIK на текущих 64-разрядных платформах int
на самом деле 32-разрядная, но long
равна 64), и она имеет double
тоже 64-разрядную, затем некоторые int
не будут представлены в виде значений double
.
Ответ 6
Прочитайте http://docs.sun.com/source/806-3568/ncg_goldberg.html