2015-05-14 6 views
-1

Сколько бит из 64 назначено целочисленной части и дробной части в двойном. Или есть какое-либо правило, чтобы указать его?Число бит, назначенных для двойного типа данных

+2

[Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf). См. Также [этот ответ] (http://programmers.stackexchange.com/questions/215065/can-anyone-explain-representation-of-float-in-memory/215126#215126). –

+1

Плавающая точка не имеет целочисленной и дробной части как таковой. Это похоже на научную нотацию. Обычные числа в общем двоичном формате имеют 11-битный двоичный показатель, изменяя значение вида 1.x, где x равно 52 бит. –

ответ

0

двойной на 64-битной машине, имеет один знаковый бит, 11 экспоненциальных битов и 52 дробных бита.

думаю (1 знаковый бит) * (52 дробных бит)^(11 бит экспоненты)

+1

Не все системы используют IEEE-754 –

+0

О, мои извинения, это была рамка, с которой я знаком. –

+0

Я прошел через это [link] (http://stackoverflow.com/questions/1848700/biggest-integer-that-can-be-stored-in-a-double) Я все еще не могу понять, почему максимальное значение double равно 1.7E308, но с 53 бит для целочисленной части оно составляет всего 2^53. Как связаны эти 2 числа? –

3

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

с плавающей точкой значения (независимо от точности) представлены следующим образом:

sign * significand * βexp 

где sign равен 1 или -1, β является базой , exp представляет собой целое число показатель , и significand - это доля. В этом случае β - 2. Например, реальное значение 3.0 может быть представлено как 1.102 * 21, или 0.112 * 22, или даже 0.0112 * 23.

Помните, что двоичное число представляет собой сумму степеней 2, при этом мощности уменьшаются слева. Например, 1012 эквивалентен 1 * 22 + 0 * 21 + 1 * 20, что дает нам значение 5. Вы можете расширить это мимо точки натальной с использованием отрицательных степеней 2, так 101.112 эквивалентно

1 * 22 + 0 * 21 + 1 * 20 + 1 * 2-1 + 1 * 2-2

, который дает нам десятичное значение 5.75. Число с плавающей точкой нормализуется таким образом, что есть один ненулевой цифры до точки натальной, так что вместо написания 5.75, как 101.112, мы бы написать это как 1.01112 * 22

Как это закодированной в 32 битный или 64-битный двоичный формат? Точный формат зависит от платформы; большинство современных платформ используют спецификацию IEEE-754 (которая также определяет алгоритмы для арифметики с плавающей запятой, а также специальные значения как бесконечность, а не число (NaN)), однако некоторые старые платформы могут использовать собственный собственный формат (например, VAX G и H с плавающей запятой). Я думаю, что x86 также имеет собственный 80-битный формат для промежуточных вычислений.

Общая схема выглядит примерно так:

seeeeeeee...ffffffff.... 

где s представляет знаковый бит, e представляет биты, посвященные экспонент, и f представляет биты, посвященные мантиссы или фракцию. -754 стандарта IEEE 32-битовое с одинарной точностью макет

seeeeeeeefffffffffffffffffffffff 

Это дает нам 8-битный показатель степени (который может представлять значения -126 через 127) и 22-битный мантиссу (дающие нам примерно от 6 до 7 значимые десятичные цифры). A 0 в знаке бит представляет собой положительное значение, 1 представляет отрицательный.Показатель кодируется таким образом, что представляет собой 000000012-126, 011111112 представляет 0 и 111111102 представляет 127 (000000002 зарезервирован для представления 0 и «денормализованный» номер, в то время как 111111112 зарезервирован для представления бесконечности и NaN). Этот формат также предполагает скрытый бит ведущей фракции, который всегда установлен на 1. Таким образом, наша ценность 5.75, которую мы представляем, как 1.01112 * 22, будут закодированы в 32-битной одинарной точности поплавка, как

01000000101110000000000000000000 
||  ||      | 
||  |+----------+----------+ 
||  |   | 
|+--+---+   +------------ significand (1.0111, hidden leading bit) 
| | 
| +---------------------------- exponent (2) 
+-------------------------------- sign (0, positive) 

Стандарт IEEE-754 двойной точности с плавающей точкой использует 11 битов для экспоненты (-1022 через 1023) и 52 бит для значения. Я не собираюсь писать это (этот пост превращается в роман, как есть).

Номера с плавающей запятой имеют диапазон , чем целые числа по показателю; экспоненту 127 требуется всего 8 бит для кодирования, но 2127 представляет собой 38-значное десятичное число. Чем больше бит в экспоненте, тем больше диапазон значений, которые могут быть представлены. Точность (количество значащих цифр) определяется количеством бит в значении. Чем больше бит в значении, тем более значимые цифры вы можете представить.

Большинство реальных значений не может быть представлено точно в качестве числа с плавающей запятой; вы не можете сжимать бесконечное число значений в конечное число бит. Таким образом, существуют промежутки между представляемыми значениями с плавающей запятой, и большинство значений будет приближений. Чтобы проиллюстрировать эту проблему, давайте посмотрим на формат 8-битном «четверть точности»:

seeeefff 

Это дает нам показатель между -7 и 8 (мы не будем беспокоиться о специальных значениях, как бесконечность и NaN) и 3-битное значение со скрытым ведущим битом. Чем больше наш экспонент, тем шире разрыв между представляемыми значениями. Вот таблица, показывающая проблему. Левый столбец является значимым; каждый дополнительный столбец показывает значения, которые мы можем представлять для данного показателя:

sig -1  0  1  2  3  4  5 
--- ----  ----- ----- ----- ----- ----- ---- 
000 0.5  1  2  4   8  16  32 
001 0.5625 1.125 2.25  4.5  9  18  36 
010 0.625  1.25  2.5  5  10  20  40 
011 0.6875 1.375 2.75  5.5  11  22  44 
100 0.75  1.5  3  6  12  24  48 
101 0.8125 1.625 3.25  6.5  13  26  52 
110 0.875  1.75  3.5  7  14  28  56 
111 0.9375 1.875 3.75  7.5  15  30  60 

Обратите внимание, что, как мы движемся в сторону больших значений, разрыв между представимых значений становится больше. Мы можем представить 8 значений между 0.5 и 1.0, с промежутком 0.0625 между каждым. Мы можем представить 8 значений между 1.0 и 2.0, с промежутком 0.125 между каждым. Мы можем представить 8 значений между 2.0 и 4.0, с промежутком 0.25 между каждым. И так далее. Обратите внимание, что мы можем представить все положительные целые числа до 16, но мы не можем представить значение 17 в этом формате; у нас просто не хватает бит в значении, чтобы это сделать. Если мы добавим значения 8 и 9 в этом формате, мы получим 16, что является ошибкой округления. Если этот результат используется в любом другом вычислении, эта ошибка округления будет усугубляться.

Обратите внимание, что некоторые значения не могут быть представлены точно независимо от того, сколько бит у вас есть в значении. Точно так же, как 1/3 дает нам бесконечную десятичную дробную часть 0.333333..., 1/10 дает нам не заканчивающуюся двоичную долю 1.10011001100....Нам понадобится бесконечное количество бит в значении, чтобы представить это значение.

Смежные вопросы