Представление целых чисел в двойных - PullRequest
19 голосов
/ 17 апреля 2009

Может ли double (из заданного числа байтов с разумным балансом мантисса / показатель экспоненты) всегда полностью точно содержать диапазон целого числа без знака, равного половине этого числа байтов?

например. может ли восьмибайтовое удвоение полностью точно хранить диапазон чисел четырехбайтового целого без знака?

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

Однобайтовое целое число без знака будет, конечно, 0 -> 255.

Ответы [ 5 ]

38 голосов
/ 17 апреля 2009

64-разрядное двойное число IEEE754 может представлять любое 32-разрядное целое число просто потому, что оно имеет 53 с лишним (a) битов, доступных для точности, а 32-разрядное целое число требует только 32: -)

Было бы правдоподобно, чтобы (не IEEE754 с двойной точностью) 64-битное число с плавающей запятой имело точность менее 32 бит. Это позволило бы действительно огромные числа (из-за экспоненты), но ценой точности.

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


(a) Технически, 53-й бит точности является подразумеваемым 1 в начале последовательности, поэтому величина «изменчивости» может составлять только 52 бита. Будь то 52 или 53, битов по-прежнему достаточно для представления каждого 32-разрядного целого числа.

7 голосов
/ 17 апреля 2009

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

2 голосов
/ 17 апреля 2009

Точный диапазон, который вы можете представить, зависит от множества факторов в вашей реализации, но вы можете ограничить его, сказав, что, если поле экспоненты установлено в 0, вы можете точно представлять целые числа вплоть до ширина вашего поля мантиссы (при условии, что бит знака). Для двойной точности IEEE 754 это означает, что вы можете точно представлять 52-битные числа. В общем, ваша мантисса будет более половины ширины всей структуры.

0 голосов
/ 17 апреля 2009

Для получения более подробной информации о том, как работает двойное число, вы можете посмотреть этот пост в блоге: Анатомия числа с плавающей запятой .

0 голосов
/ 17 апреля 2009

Я бы не использовал слова «полностью точно», когда говорил о числах с плавающей точкой. Но да, double может представлять 32-разрядное целое число.

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

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

...