Э. Таненбаум - Архитектура компьютера (1127755), страница 189
Текст из файла (страница 189)
16. Напишите программу, которая на входе получает 2 строки из 32 АБСП-символов нулей и единиц. Каждая строка представляет 32-разрядное двоичное число в системе с дополнением до двух. На выходе программа должна выдавать их сумму в виде строки из 32 АЯСП-символов нулей и единиц. Приложение Б Числа с плавающей точкой Диапазон чисел, используемых при различных вычислениях, очень велик.
Например, в астрономические вычисления может включаться масса электрона (9 х 10'~ грамм) и масса Солнца (2 х 10зз грамм). Диапазон чисел здесь превышает 10~~. Эти числа можно представить следующим образом: 0000000000000000000000000000000000.0000000000000000000000000009 2000000000000000000000000000000000.0000000000000000000000000000 При всех вычислениях должны сохраняться 34 разряда слева от десятичной точки и 28 разрядов справа от нее.
Это даст 62 значимых разряда в результатах. На бинарном компьютере можно использовать арифметику с многократно увеличенной точностью, чтобы обеспечить достаточную значимость. Однако мы не можем определить массу Солнца с точностью даже до пяти значимых разрядов, не говоря уже о 62. В действительности практически невозможно выполнить какие-либо измерения с точностью до 62 знаков.
Можно было бы хранить все промежуточные результаты с точностью до 62 значимых разрядов, а перед выводом окончательных результатов отбрасывать 50 или 60 разрядов, но процессор и память тратили бы на это слишком много времени. Нам нужна такая система для представления чисел, в которой диапазон выражаемых чисел не зависит от числа значимых разрядов. В этом приложении мы расскажем о такой системе.
В ее основе лежит экспоненциальное представление чисел, которое применяется в физике, химии и машиностроении. Принципы представления чисел с плавающей точкой Числа можно выражать в следующей общепринятой экспоненциальной форме: п =~х 10', где ~ называется дробью, или мантиссой, а е (это положительное или отрицательное целое число) — экспонеитой. Компьютерная версия такого представления называется представлением числа с плавающей точкой. Вот примеры чисел в такой записи: 3,14 = 0,314 х 10' = 3,14 х 10 0,000001 = 0,1 х 10-' = 1,0 х 10-' 1941 = 0,1941 х 10 = 1,941 х 10 Область значений определяется по числу разрядов в экспоненте, а точность— по числу разрядов в мантиссе.
Существует несколько способов представления 746 Приложение Б. Числа с плавающей точкой того или иного числа, поэтому одна форма выбирается в качестве стандартной. Чтобы изучить свойства такого способа представления, рассмотрим представление Я с трехразрядной мантиссой со знаком в диапазоне 0,1 < ~Я < 1 и двухразрядной экспонентой со знаком. Эти числа находятся в диапазоне от +0,100 х 10 вз до +0,999 х 10"эз, то есть простираются почти на 199 значимых разрядов, хотя для записи числа требуется всего 5 разрядов и 2 знака. Числа с плавающей точкой можно использовать для моделирования системы действительных чисел в математике, хотя здесь есп несколько существенных различий. На рис.
Б.1 представлена ось действительных чисел. Она разбита на 7 областей; 1. Отрицательные числа меньше — 0,999 х 10вв. 2. Отрицательные числа от — 0,999 х 10зв до — 0,100 х 10-ээ. 3. Отрицательные числа от — 0,100 х 10-зз до нуля. 4. Нуль. 5. Положительные числа от 0 до 0,100 х 10 эз. 6.
Положительные числа от 0,100 х 10 вв до 0,999 х 10вв. 7. Положительные числа болыпе 0,999 х 10вв. 3 б 1бн00 О 1вч00 Рис. Б.1. Ось действительных чисел разбита на 7 областей -10вв 1О Первое отличие действительных чисел от чисел с плавающей точкой, которые записываются тремя разрядами в мантиссе и двумя разрядами в экспоненте, состоит в том, что последние нельзя использовать для записи чисел из областей 1, 3, 5 и 7. Если в результате арифметической операции получится число из области 1 или 7 (например, 10вс х 10в' = 10мс), то произойдет ошибка переполнения и результат будет неверным.
Причина — ограничение области значений чисел в данном представлении. Точно так же нельзя выразить результат из области 3 или 5. Такая ситуация называется ошибкой потери значимости. Эта ошибка менее серьезна, чем ошибка переполнения, поскольку часто нуль является вполне удовлетворительным приближением для чисел из областей 3 или 5. Остаток счета в банке на 10 'вт не сильно отличается от нулевого остатка счета.
Второе важное отличие чисел с плавающей точкой от действительных чисел — их плотность. Между любыми двумя действительными числами х и у существует другое действительное число независимо от того, насколько близко к у расположено число х. Это свойство вытекает из того, что для любых отличных действительных чисел х и у между ними существует действительное число г = (х + у)/2.
Действительные числа формируют континуум. Принципы представления чисел с плавающей точкой 747 Таблица Б.1. Приблизительные верхняя и нижняя границы чисел с плавающей точкой Количество разрядое в мантносе Количество разрядов Нижняя граница Верхняя граница е экспоненте 10 '2 10 ке 10-1002 10-10002 1 0-13 100 1000 10000 100000 10в 1Ом 10000 1Омвв 1Ов 1Ом 1Овм 1 Омвв 10000 10000 1О '00 10 10п 10-ивов 4 4 5 5 5 5 10 20 1 0-14 10 '04 10-1004 10-'0004 10-1000 10-1010 Числа с плавающей точкой континуума не формируют. В двухзнаковой пяти- разрядной системе можно выразить ровно 179 100 положительных чисел, 179 100 отрицательных чисел и 0 (который можно выразить разными способами), то есть всего 358 201 чисел.
Из бесконечного числа действительных чисел в диапазоне от — 10"00 до ч-0,999 х 1000 в этой системе можно выразить только 358 201 число. На рис. Б.1 эти числа показаны точками. Результат вычислений может быть и другим числом, даже если он находится в области 2 или 6. Например, результат деления числа 0-0,100 х 100 на 3 нельзя выразить точно в нашем представлении. Если полученное число нельзя выразить с помощью используемого представления, нужно брать ближайшее представимое число. Такой процесс называется округлением.
Промежутки между смежными числами, которые можно выразить в представлении с плавающей точкой, в областях 2 и 6 не постоянны. Промежуток между числами ч-0,998 х 1002 и 0-0,999 х 10эв гораздо больше промежутка между числами ч-0,998 х 100 н е0,999 х 100. Однако если промежутки между числом и его соседом выразить как процентное отношение от этого числа, большой разницы в промежутках не будет. Другими словами, относительная погрешность, полученная при округлении, приблизительно равна и для малых, и для больших чисел.
Выводы, сделанные для системы представления с трехразрядной мантиссой и двухразрядной экспонентой, справедливы и для других представлений чисел. При изменении числа разрядов в мантиссе или экспоненте просто сдвигаются границы областей 2 и 6, и меняется число представляемых единиц в этих областях. С увеличением числа разрядов в мантиссе увеличивается плотность алементов и, следовательно, точность приближения.
С увеличением количества разрядов в экспоненте области 2 и 6 увеличиваются за счет уменьшения областей 1, 3, 5 и 7. В табл. Б.1 показаны приблизительные границы области 6 для десятичных чисел с плавающей точкой и различным количеством разрядов в мантиссе и экспоненте. 748 Приложение Б. Числа с плавающей точкой Пример 1: Основание степени 2 з а О О О О О О О О О О 1 1 О 1 1= гш (1. г-"+1.ги'+1.ги' +1х2 "з) = 432 Мантисса: 1х2 "з+1хгнз +1х2 +1хгчз 0 1010100 0 Зйак Экспонента + сосмещением 64 (84-64=20) сь о з е Для приведения к нормализованному виду нужно сдвинуть мантиссу влево на 11 бит и вычесть 11 из экспоненты Я и йо й4 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0=2 (1х21+1хг~+1хг Мантисса: 1х2' +1х2з +1х2 з ) = 432 +1х2'4 +1х2 з О 1ОО1ОО1 Знак Экспонента + со смещением 73-64=9 а сь о Пример 2: Основание степени 16 161 л О 1ООО1О1 ОО ОО Знак Экспонента + сосмещением Мантисса: 1Х16 +ВХ16 69-64=5 16 з 16 з 16 л л л 1011 0000 0000 =16 (1х16з+Вх16 )=432 а И йа к о.
ис о о Ф Для приведения к нормализованному виду нужно сдвинуть мантиссу влево на 2 шестнадцатеричных разряда и вычесть 2 из экспоненты 0 1000011 0001 1011 0000 0000 =16 (1х161+Вх16з)=432 Знак Экспонента Мантисса; тх16 1+Вхтв з + со смещением 67-64=3 $ е кд и кь а о Х Рис. 6.2. Примеры нормализованных чисел с плавающей точкой Вариант такого представления применяется в компьютерах. Основа возведения в степень — 2, 4, 8 или 16, но не 10.
В этом случае мантисса состоит из цепочки двоичных, четверичных, восьмеричных и шестнадцатеричных разрядов, Если крайний левый разряд равен О, то все разряды можно сместить на один влево, а экспоненту уменьшить на 1, не меняя при этом значения числа (исключение составляет ситуация потери значимости). Мантисса с ненулевым крайним левым разрядом называется нормализованной. Нормализованные числа обычно предпочитаются ненормализованным, поскольку существует только одна нормализованная форма, а ненормализованных форм может быть много.
Примеры нормализованных чисел с плавающей точкой даны на рис. Б.2 для двух оснований степени. В этих примерах показана 16-разрядная мантисса (включая знаковый бит) и 7-разрядная экспонента. Точка находится слева от крайнего левого бита мантиссы и справа от экспоненты. Стандарт )ЕЕЕ 754 749 Стандарт!ЕЕЕ 754 До 80-х годов каждый производитель поддерживал собственный формат чисел с плавающей точкой. Все они отличались друг от друга. Более того, в некоторых из них арифметические действия выполнялись неправильно, поскольку арифметика с плавающей точкой имеет некоторые тонкости, которые не очевидны для среднестатистического разработчика аппаратного обеспечения. Чтобы изменить эту ситуацию, в конце 70-х годов институт 1ЕЕЕ учредил комиссию по стандартизации арифметики с плавающей точкой.