Жмакин А.П. Архитектура ЭВМ (2006) (1186252), страница 11
Текст из файла (страница 11)
Пусть А — делимое, В — делитель, С — частное, W — остаток.
Очевидно, при представлении чисел с фиксированной запятой как дробных, должно соблюдаться условие
|A|<|B| (3.29)
иначе С ≥ 1, что соответствует переполнению разрядной сетки.
Процесс деления двоичных чисел может быть сведен к последовательности вычитаний и анализа знаков получающихся остатков. Сформулируем словесный алгоритм деления следующим образом:
1. Вычетают из делимого делитель. Если знак разности 0, то деление невозможно в силу нарушения условия (3.29), и следует, установив OV = 1, завершить операцию; иначе в разряд целой части частного записывают О (в конце операции в этот разряд помещается знак частного).
2. Так как остаток (разность А-В) оказался отрицательным, восстанавливают остаток путем добавления делителя к остатку.
3. Сдвигают восстановленный остаток влево на один разряд.
4. Вычитают из сдвинутого остатка делитель; если полученная разность положительна, то очередной цифрой частного становится 1, и следует перейти к п. 3; иначе очередная цифра частного — 0 и переходят к п. 2.
Пункты 2—4 повторяют столько раз, сколько цифр требуется получить в частном.
Пример 3.24
Деление дробных положительных чисел + (3/16):+(12/16) = +(1/4) = +(4/16) приведено на рис. 3.29.
3.9.1. Деление без восстановления остатка
Приведенный выше метод деления называется методом деления с восстановлением остатка. При получении отрицательного остатка на очередном шаге деления необходимо перед левым сдвигом восстановить остаток путем добавления к нему делителя. При этом для получения п -разрядного частного требуется в среднем 1,5и циклов сложения/вычитания.
Существует алгоритм деления без восстановления остатка, позволяющий корректировать отрицательные остатки без дополнительного цикла сложения. Рассмотрим действия, производимые с остатками в цикле деления в зависимости от полученного знака остатка (табл. 3.4).
Видно, что если на очередном шаге остаток получился отрицательный, его можно не восстанавливать, но на следующем шаге в этом случае нужно
вместо вычитания делителя из сдвинутого остатка добавить делитель к сдвинутому остатку.
Действительно, если W - В < 0, то следует восстановление остатка и сдвиг восстановленного остатка влево (его удвоение) 2-(W-B + В). На следующем шаге вычитаем делитель и получаем 2W-B . Тот же результат может быть получен, если сдвинуть невосстановленный остаток, но на следующем шаге вместо вычитания произвести добавление делителя: 2{W-B) + B = 2W-2B + B = 2W + B.
3.10. Арифметические операции с числами, представленными в формате с плавающей запятой
В таком формате число определяется значениями мантиссы и порядка:
N = m-qp, (3.30)
где m — мантисса числа, р — порядок, q — основание.
Мантисса и порядок могут иметь свои знаки, причем знак мантиссы соответствует знаку числа. Основание q может не совпадать с основанием системы счисления. При операциях с двоичными числами часто для расширения диапазона представления чисел выбирают q - 2к, например, q = 16.
В машинном представлении формат числа с плавающей запятой (рис. 3.30) задается двумя полями— полем мантиссы m и полем порядка р, причем каждое поле имеет свой разряд знака. Значение порядка в формате числа не указывается — оно подразумевается одинаковым для всех чисел.
Мантисса и порядок представляются в формате с фиксированной запятой, причем обычно порядок — целое число со знаком (запятая фиксирована после младшего разряда), а мантисса — правильная дробь (запятая фиксирована между знаковым разрядом и старшим разрядом модуля). С целью увеличения точности представления числа в заданном формате мантиссу представляют в нормализованной форме, когда старший разряд модуля мантиссы — не ноль (для прямых кодов). Действительно,
0,2364 104 «0,0024 106,
однако в последнем случае мантисса не нормализована и точность представления числа — всего два десятичных разряда.
Существуют и другие форматы представления чисел с плавающей запятой. Так, стандарт IEEE1, который, кстати, поддерживают (со)процессоры семейства х86(87) предусматривает числа с одинарной и двойной точностью.
Форматы представлены тремя полями:
□ s —знак числа;
□ е —характеристика;
□ m —мантисса.
Формат с одинарной точностью занимает 32-разрядное двоичное слово, причем знак s размещается в его старшем разряде, характеристика е — в следующих 8 разрядах и, наконец, 23 младших разряда занимает мантисса т .
Порядок р, под который отводится один байт, может принимать значения в диапазоне +127. Характеристика в стандарте IEEE получается как порядок с избытком 127: е = р +127 . При этом характеристика всегда положительна, что упрощает выполнение арифметических операций.
Мантисса числа в стандарте IEEE нормализована и лежит в диапазоне
1≤ т < 2. Целая часть мантиссы всегда равна 1, поэтому значение целой части не хранится в формате числа, а подразумевается (т. н. "скрытая единица"). Дробная часть мантиссы хранится в 23 младших разрядах формата.
Формат с двойной точностью отличается длиной полей характеристики (11 битов с избытком 1023) и мантиссы (52 бита) и размещается в 64-разрядном двоичном слове.
Попробуйте самостоятельно оценить диапазон представления чисел в форматах IEEE. Подробности о выполнении операций с этими форматами можно посмотреть в [3, 12].
3.10.1. Сложение и вычитание
Ранее мы договорились, что алгебраическое вычитание легко свести к алгебраическому сложению путем замены знака второго операнда. Поэтому рассмотрим процесс алгебраического сложения. Для уяснения принципа выполнения сложения чисел с плавающей запятой рассмотрим пример в десятичной системе.
Пример 3.25
Сложить два числа, представленные в формате с плавающей запятой:
Обратите внимание, мантиссы чисел нормализованы. Очевидно, прежде чем складывать мантиссы, требуется преобразовать числа таким образом, чтобы они имели одинаковые порядки. Выравнивание порядков можно выполнить двумя способами — уменьшением большего порядка до меньшего или увеличением меньшего до большего (рис. 3.31).
В первом случае за разрядную сетку выходят старшие разряды сдвигаемой мантиссы и результат сложения оказывается неверным. Во втором случае при сдвиге теряются младшие разряды мантиссы, что не влияет на точность результата. Поэтому при выравнивании порядков всегда следует увеличивать меньший порядок до большего при соответствующем уменьшении мантиссы. Для выравнивания порядков следует определить разность порядков слагаемых и сдвинуть мантиссу числа с меньшим порядком вправо на величину
этой разности. Если разность порядков превышает разрядность поля мантиссы, то значение слагаемого с меньшим порядком может быть принята за 0, а результат суммирования будет равен слагаемому с большим порядком. После выравнивания порядков следует сложить мантиссы и определить в качестве порядка результата порядок любого из слагаемых (после выравнивания порядки слагаемых равны). Если при сложении мантисс возникает переполнение, то результат может быть исправлен путем сдвига мантиссы суммы на один разряд вправо и добавления единицы к порядку результата. Однако если в результате этого добавления произойдет переполнение разрядной сетки порядков, то результат окажется неверным — имеет место т. н. положительное переполнение: OV :=1 (рис. 3.32).
А = 0,96502-10+2 Л = 0,96502 -10+2
В = 0,73005 10+1 В = 0,07300 -10+2
С = 1,03802 • 10+2 — переполнение мантисс!
С = 1,0380 • 10+3 — правильный результат
Рис. 3.32. Положительное переполнение
В результате алгебраического сложения мантисс результат может оказаться ненормализованным. Для нормализации результата необходимо сдвигат мантиссу результата влево до тех нор, пока в старшем значащем разряде не окажется цифра, отличная от 0 (в двоичной системе это 1), сопровождая каждый сдвиг уменьшением на 1 порядка результата (рис. 3.33). Этот процесс называется нормализацией результата.
A=0,24512-10-8 В = -0,24392- 10~8
С = 0,00120 Ю-8 =0,12000 10"10
Рис. 3.33. Положительное переполнение
В процессе уменьшения порядка при нормализации может оказаться, что модуль порядка превысил максимальную величину, размещаемую в поле порядка. Этот случай называют отрицательным переполнением. Его можно избежать, оставив результат ненормализованным, однако принято считать, что сохранять ненормализованный результат в памяти недопустимо. Поэтому в случае отрицательного переполнения результат принимает значение "машинный ноль".
Итак, процедура алгебраического сложения чисел с плавающей запятой складывается из следующих этапов:
1. Выравнивание порядков.
2. Алгебраическое сложение мантисс как чисел с фиксированной запятой.
3. Нормализация результата.
Алгоритм операции сложения с плавающей запятой представлен на рис. 3.34. Первая часть алгоритма — выравнивание порядков, представлена достаточно подробно, хотя можно предложить несколько различных способов реализации этой процедуры (в зависимости от способа кодирования порядков, требования к быстродействию и экономичности арифметического устройства). Алгоритм алгебраического сложения мантисс (как чисел с фиксированной запятой) подробно обсуждался выше (см. разд. 3.4—3.6, рис. 3.3, 3.21, 3.22), поэтому в рассматриваемом алгоритме он представлен одним блоком. Нормализация результата приведена для случая представления чисел в прямом коде.
3.10.2. Умножение и деление
Положим
A=mA ∙ qpa ;
B=mb ∙ qpb
C=mc ∙ qpc
D=mD ∙ qpd
Тогда
C = AxB = (mAxmB)-qPA+PB, т. е. mc = mAxmB, pc = pA+pB.
D = A + B = (mA +mB)-qPA-PB, т. e. mD =mA + mB, pD=pA-pB.
Таким образом, умножение чисел с плавающей запятой сводится к двум операциям (умножение мантисс и сложение порядков) над числами с фиксированной запятой, а деление — к делению мантисс и вычитанию порядков — также к двум операциям с фиксированной запятой, которые были подробно рассмотрены выше.
3.11. Арифметические операции над десятичными числами
3.11.1. Кодирование десятичных чисел
При использовании в ЦВМ десятичные числа кодируются группой двоичных разрядов. Учитывая, что