Автор работы: Пользователь скрыл имя, 11 Декабря 2010 в 14:59, реферат
Понятие информации и информатики
Можно убедиться,
что 3-битовое представление с избытком
является представлением с избытком четыре.
Набор битов | Значение | Набор битов | Значение | |
1111 | 7 | 111 | 3 | |
1110 | 6 | 110 | 2 | |
1101 | 5 | 101 | 1 | |
1100 | 4 | 100 | 0 | |
1011 | 3 | 011 | -1 | |
1010 | 2 | 010 | -2 | |
1001 | 1 | 001 | -3 | |
1000 | 0 | 000 | -4 | |
0111 | -1 | |||
0110 | -2 | |||
0101 | -3 | |||
0100 | -4 | |||
0011 | -5 | |||
0010 | -6 | |||
0001 | -7 | |||
0000 | -8 |
Рис. 1.12. 4-битовое
и 3-битовое представление с
Для хранения чисел с дробной частью требуется хранить не только двоичное представление числа, но также позицию разделительной точки. Общепринятым способом хранения дробей является представление с плавающей точкой.
Рассмотрим представление чисел с плавающей точкой (floating-point notation) на примере. Для хранения числа будем использовать только 1 байт памяти. В машинах обычно используются более длинные коды, а этот 8-битовый формат является уменьшенным аналогом существующих систем, и позволяет объяснить основные понятия.
Сначала, старший разряд бита назовем знаковым разрядом. Как и раньше, 0 в позиции знакового разряда означает, что число положительное, 1 в позиции знакового разряда означает, что число отрицательное. Затем разделим оставшиеся в байте семь разрядов на две группы или два поля: порядок (exponent field) и мантиссу (mantissa field). Пусть первые три бита после знакового будут порядком, а оставшиеся четыре — мантиссой.
Теперь рассмотрим значение каждой из частей на примере. Байт содержит такую последовательность битов: 00101011. Проведем анализ этой последовательности, применяя определения, данные выше: знаковый разряд равен 0, порядок — 010 и мантисса — 1011. Чтобы расшифровать значение, хранящееся в байте, сначала извлечем мантиссу и поместим слева от нее разделительную точку, получим: .1011.
Знаковый разряд Порядок
Рис. 1.13. Порядок представления дробных
чисел
Затем извлечем порядок (010) и переведем его как 3-битовое представление с избытком в десятичную систему счисления. В нашем случае код порядка является представлением 2. Переместим разделительную точку на 2 бита вправо (отрицательный порядок означает, что точку нужно перемещать влево). Следовательно, мы имеем последовательность
10.11,
которая является двоичной записью дроби 23/4. Затем обращаем внимание на то, что знаковый разряд равен 0, следовательно, перед нами положительное число. Делаем вывод, что в байте 00101011 хранится число 23/4.
Рассмотрим еще один пример. Байт имеет последовательность: 10101010.
Выписываем мантиссу
.1010
и перемещаем точку на один бит влево, так как порядок (010) в 3-битовом представлении с избытком является кодом числа -2. Имеем последовательность 0101010, которая является кодом 5/32. Знаковый разряд исходной последовательности равен 1, значит, это число отрицательное. Делаем вывод, что последовательность 10101010 является кодом -5/32.
Чтобы записать
число в представлении с
1001.
Теперь нужно заполнить поле порядка. Для этого представляем мантиссу с разделительной точкой слева и определяем число битов и направление, в котором нужно передвинуть точку, чтобы получить исходную двоичную запись. В нашем примере, чтобы получить 01011001, нужно передвинуть точку в .1001 на один бит вправо. Следовательно, порядок равен 1, поэтому записываем 101 (код 1 в представлении с избытком 4) в поле порядка. Наконец, записываем в позицию знакового разряда 0, потому что дробь положительная. Окончательный байт выглядит так: 01011001.
Наиболее важным в преобразовании является заполнение поля мантиссы. Правило гласит: выписывать последовательность разрядов двоичной записи слева направо, начиная с самой левой 1 в двоичной записи. В качестве примера рассмотрим процесс записи числа 3/8, двоичное представление которого .011. В этом случае мантиссой будет 1100 а не 0110.
Мантисса имеет такой вид, потому что поле мантиссы заполняется, начиная с самой левой единицы, которая появляется в двоичном представлении. Это правило исключает возможность многократной записи одного значения. Оно также означает, что мантисса чисел, не равных нулю, будет всегда начинаться с 1. О таком представлении говорят, что оно нормализованное (normalized form). Обратите внимание, что представление нуля является особым случаем: его представление с плавающей точкой состоит из одних нулей.
Попытаемся записать значение 25/8 в представлении с плавающей точкой, используя для него один байт памяти. Сначала записываем 25/8 в двоичном представлении, получаем код 10.101.
Но, когда мы переписываем его в поле мантиссы, нам не хватает места, и самая правая 1 (которая занимает позицию с весом разряда ]/8) теряется.
Исходная запись
Двоичная запись
Последовательность битов
_ _ _ _ 1010
Потерянный бит
Знаковый
Если мы на данном этапе будем игнорировать эту проблему и продолжим заполнение поля порядка, то в результате придем к последовательности 01101010, которая является представлением 21/2 вместо 25/8. То, что произошло, называется ошибкой усечения (truncation error), или ошибкой округления (round-off error), и означает, что часть числа потеряна, потому что поле мантиссы недостаточно велико.
Если использовать более длинное поле для мантиссы, то количество таких ошибок можно уменьшить.
Например, для хранения чисел в форме представления с плавающей точкой используется, по меньшей мере, 32 бита вместо 8 битов, которые мы использовали здесь. Такой подход позволяет также увеличить поле для порядка числа. Но даже в этом формате представления иногда возникает необходимость более точных расчетов.
Другой причиной ошибки усечения может быть явление, с которым мы уже сталкивались в десятичной системе счисления: проблема бесконечных дробей, таких, например, которые появляются, когда мы пытаемся представить 1/3 в виде десятичной дроби. Некоторые числа просто нельзя точно записать в виде десятичной дроби, независимо от количества цифр, которое мы используем.
Десятичная и
двоичная системы счисления различаются
тем, что в двоичной системе существует
больше чисел с бесконечным
Ошибка усечения и связанные с нею проблемы представляют большую важность для людей, работающих в области численного анализа. Этот раздел математики занимается проблемами, которые возникают при действительных расчетах, часто очень объемных и требующих высокой точности.
Следующий пример из области численного анализа. Предположим, нам нужно найти сумму следующих трех чисел, используя однобайтовое представление с плавающей точкой:
21/2 + 1/8 + 1/8.
Если мы будем складывать числа в указанном порядке, то сначала прибавим 1/8 к 21/2, получим дробь 25/8, двоичная запись которой — 10.101. К сожалению, когда мы сохраняем это число, возникает ошибка усечения, в результате которой полученная нами сумма будет сохранена как 21/2 (что равно одному из слагаемых). На следующем шаге мы прибавляем к этой сумме 1/8. Здесь опять возникает ошибка усечения, в результате которой мы получаем неправильный ответ 21/2.