вторник, 15 октября 2013 г.

Представление вещественных числе в памяти компьютера

Вещественные числа обычно представляются в виде чисел с плавающей запятой. Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений, его можно считать аналогом экспоненциальной записи чисел, но только в памяти компьютера.
Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые знакпорядок и мантиссу. В наиболее распространённом формате число с плавающей запятой представляется в виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и ещё один бит используется для указания знака числа (0 - если число положительное, 1 - если число отрицательное). При этом порядок записывается как целое число, а мантисса - в нормализованном виде, своей дробной частью в двоичной системе счисления. Вот пример такого числа из 16 двоичных разрядов:
Знак
ПорядокМантисса
0000000000000000
141090
Знак - один бит, указывающий знак всего числа с плавающей точкой. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:
(-1)^s \times M \times B^E, где s — знак, B-основание, E — порядок, а M — мантисса.
Порядок также иногда называют экспонентой или просто показателем степени.
При этом лишь некоторые из вещественных чисел могут быть представлены в памяти компьютера точным значением, в то время как остальные числа представляются приближёнными значениями.

Нормальная и нормализованная форма

Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [0; 1). Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать в 4 формах — 0,0001×100, 0,001×10−1, 0,01×10−2, 0,1×10−3), поэтому распространена также другая форма записи —нормализованная, в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (не включительно), а мантисса двоичного числа принимает значения от 1 (включительно) до 2 (не включительно). То есть в мантиссе слева от запятой до применения порядка находится ровно один знак. В такой форме любое число (кроме 0) записывается единственным образом. Ноль же представить таким образом невозможно, поэтому стандарт предусматривает специальную последовательность битов для задания числа 0 (а заодно и некоторых других полезных чисел, таких как -\infty и +\infty). 

Диапазон значений чисел с плавающей запятой

Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя (когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number, "не число", получается как результат операций типа деления нуля на ноль) и \pm\infty.

НазваниеТип в языке программирования CДиапазонБиты мантиссыБиты
Half precisionНет6,10×10-5..6550410+116
Single precisionfloat3,4×10-38..3,4×103823+132
Double precisiondouble1,7×10-308..1,7×1030852+164

Алгоритм получения представления вещественного числа в памяти ЭВМ

Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.
Как видно из таблицы, величина это типа занимает в памяти 8 байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):
SСмещенный порядокМантисса
6362..5251..0
Можно заметить, что старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от 2-1023до 21023, поэтому смещение равно 1023(10) = 1111111111(2). Наконец, бит с номером 63 указывает на знак числа.
Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:
  1. перевести модуль данного числа в двоичную систему счисления;
  2. нормализовать двоичное число, т.е. записать в виде M × 2p, где M — мантисса (ее целая часть равна 1(2)) и p — порядок, записанный в десятичной системе счисления;
  3. прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
  4. учитывая знак заданного числа (0 — положительное; 1 — отрицательное), выписать его представление в памяти ЭВМ.
Пример. Запишем код числа -312,3125.
  1. Двоичная запись модуля этого числа имеет вид 100111000,0101.
  2. Имеем 100111000,0101 = 1,001110000101 × 28.
  3. Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).
  4. Окончательно
    1100000001110011100001010000000000000000000000000000000000000000
    6362..5251..0
Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).
Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.
Пример. Пусть дан код 3FEC600000000000(16) или
0011111111101100011000000000000000000000000000000000000000000000
6362..5251..0
  1. Прежде всего замечаем, что это код положительного числа, поскольку в разряде с номером 63 записан нуль. Получим порядок этого числа: 01111111110(2) = 1022(10); 1022 - 1023 = -1.
  2. Число имеет вид 1,1100011 × 2-1 или 0,11100011.
  3. Переводом в десятичную систему счисления получаем 0,88671875.

Материалы по теме






Задание

1. Вещественные числа хранятся в 32битовой ячейке, 7 бит отведено под порядок. Оцените, какое самое большое положительно и самое маленькое отрицательное число можно записать в данную ячейку?
Ответ в коментарии. Первый правильный и обоснованный ответ получает "отлично" :)

Вопросы "4-3-2-1"

Ответьте в комментариях на вопросы:
4 новых понятия, которые узнал
3 новых факта, которые узнал
2 вопроса, на которые я не получил ответа
1 самая важная мысль, которая меня посетила


6 комментариев:

  1. Максимальное положительное и минимальное отрицательное число различаются только знаком, значит мантисса и порядок будут одинаковы в обоих случаях, p — основание системы счисления.

    Максимальный несмещённый порядок, состоящий из семи знаков:
    1111111 (p=2), т. е. мантисса будет умножена на 10^1111111 при p=2 или на 2^127 при p=10
    Максимальная мантисса для несмещённого порядка:
    11111111111111111111111 (p=2) или 2^22+2^21+...2^2+2^1+2^0 (p=10) т. е. 2^23–1 или 8388607.


    Сами числа в двоичной системе будут выглядеть так:
    Положительное: –1^0×1111111×11111111111111111111111,
    Отрицательное: –1^1×1111111×11111111111111111111111,

    или

    1×^127×(2^23–1) и –1×2^127×(2^23–1).
    Приблизительно равно 1,4272475×10^45 и –1,4272475×10^45.

    ОтветитьУдалить
  2. 4-знак,порядок,мантисса,величина типа double.
    3-1)Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений;2)Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [0; 1) 3)Порядок также иногда называют экспонентой или просто показателем степени.
    2-1)Как это все работает? 2)Кто и когда это изобрел?
    1-Тяжела жизнь информатика!

    ОтветитьУдалить
  3. 4) Порядок мантисса, нормальная форма числа, нормализованная форма числа
    3)Порядок также иногда называют экспонентой или просто показателем степени.
    Лишь некоторые из вещественных чисел могут быть представлены в памяти компьютера точным значением, в то время как остальные числа представляются приближёнными значениями.
    Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений
    2) Зачем это было придумано? Как вообще всё это применять?
    1) Надо было делать информатику заранее...

    ОтветитьУдалить
  4. 4) Мантисса, нормализованная форма числа, порядок, знак
    3) Порядок иногда называют показателем степени,
    Числа с плавающей запятой — один из возможных способов представления вещественных чисел, который является компромиссом между точностью и диапазоном принимаемых значений,
    Нормализованный вид числа - 0,1 < или = m < 1
    2) Кто придумал эту замудренную систему? Как мы будем это использовать?
    1) Когда мы будем пользоваться этим на компютере

    ОтветитьУдалить
  5. 4. Мантисса, порядок, нормализованная запись числа, знак
    3. Нормальная форма записи числа с плавающим знаком- та форма, в которой Мантисса (без учета знака) в десятичной системе находится на полу интервале. Числа с плавающей запятой- один из способов представления действительного числа, но в компьютере.
    2. Где это нам пригодится? И как это применять?
    1. Чувствую, это придется перечитать еще на пару раз.

    ОтветитьУдалить