Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Организвция ЭВм и систем

.pdf
Скачиваний:
94
Добавлен:
01.05.2014
Размер:
975.96 Кб
Скачать

Пример.

Вычислить Z=X*Y=0.1101(2) * 0.1011(2) = 0.8125(10) * 0.6875(10) = 0.55859375(10).

X= 0. 1 1 0 1

Y= 0. 1 0 1 1

0.1101 P1

+0.0110 1 сдвиг на 1 разряд вправо

0.1101 P2

1.0011 1 сумма P1 + P2

0.1001 11 сдвиг на 1 разряд вправо

+0.0000 P3

0.1001 11 сумма P1+P2+P3

0.0100111 сдвиг на 1 разряд вправо

+0.1101 P4

1.0001111 сумма P1+P2+P3+P4

0.10001111 сдвиг на 1 разряд вправо

+0.0000

0.10001111 - результат

Таким образом, результат Z=0.1000(2)=0.5(10), поскольку последние четыре разряда потеряны.

При перемножении мантисс (правильных дробей) последнее сложение можно не делать, а ограничиться просто последним сдвигом. Из примера видно, что если разрядная сетка ограничена числом разрядов X, то результаты правее вертикального пунктира не фиксируются после выполнения сдвигов. Таким образом, четыре младших разряда будут потеряны, и результат будет приближенный 0.1000(2). В ряде случаев используется округление по правилу: если старший из отбрасываемых разрядов содержит 1, то к младшему из сохранившихся разрядов добавляется 1. В данном примере получается число 0.1001(2).

В заключение отметим следующее:

если мантисса X или Y равна 0, то перемножение не проводится и Z=0;

если при суммировании PX и PY возникло переполнение и PZ<0, то это означает, что Z меньше минимального представляемого в машине числа, и Z присваивают 0 без перемножения мантисс;

если при суммировании PX и PY возникло переполнение и PZ>0, может оказаться, что Z все же находится в диапазоне представляемых в ЭВМ чисел, так

как после нормализации полученного qZ переполнение в порядке может исчезнуть.

2.7.5. Методы ускорения умножения

Рассмотренный в предыдущей теме материал показывает, что умножение – это достаточно длинная операция, состоящая из N суммирований и сдвигов, а также выделений очередных цифр множителя.

Из этого следует актуальность задачи максимального сокращения времени, затрачиваемого на операцию умножения, особенно для систем, работающих в реальном масштабе времени. В современных ЭВМ методы ускорения умножения можно разделить:

на аппаратные;

логические (алгоритмические);

комбинированные.

50

Аппаратные методы

1.Распараллеливание вычислительных операций. Например, совмещение во времени суммирования и сдвига.

2.Табличное умножение. Это довольно распространенный способ реализации различных функций. Остановимся на нем подробнее.

Пусть X и Y – целые числа длиной в 1 байт. Надо вычислить Z=X*Y. Можно ис-

пользовать 65 Кбайт памяти и занести в них значения Z для всех возможных комбинаций X и Y, а сомножители X и Y использовать в качестве адреса. Получается своеобразная таблица следующего вида:

 

X

 

Y

 

Z

 

00...

00

00...

00

000...

000

 

8 бит

8 бит

16 бит

65 к

.........

 

.........

.........

 

.........

 

.........

.........

 

11..11

11..11

111..111

 

 

Адрес

 

Содержание

 

Алгоритмические методы

Эти методы разнообразны. Приведем только один пример: при S=16 можно за один такт обрабатывать несколько разрядов множителя (4 разряда). Сдвиги тоже осуществляются на 4 разряда. Следует отметить, однако, что в большинстве случаев алгоритмические методы требуют определенную аппаратную поддержку.

Комбинированные методы

Рассмотрим пример. Пусть X и Y – 16-разрядные числа. Надо вычислить произведение вида Z=X*Y. Использовать непосредственно табличный метод не удастся, поскольку для этих целей потребуется очень большой объем памяти. Однако можно представить каждый сомножитель как сумму двух 16-разрядных слагаемых, каждое из которых представляет группы старших и младших разрядов сомножителей. В этом случае произведение примет вид

Z= X*Y = (x15 ... x0)*(y15 ... y0) =

=(x15...x8000...0 + 000...0x7...x0)* (y15...y8000...0 + 000...0y7...y0) =

=216(x15...x8) (y15...y8) + 28(x15...x8) (y7...y0) + 28(x7...x0) (y15...y8) + + (x7...x0)*(y7...y0) .

Таким образом, произведение раскладывается на простые 8-разрядные сомножители. Эти произведения 8-разрядных операндов вычисляются табличным методом, а затем следует сдвиг слагаемых сразу на 16,8,8,0 разрядов и суммирование.

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

Алгоритмы деления чисел с плавающей запятой в настоящем курсе не рассматриваются. Информацию о них можно найти в литературе, приведенной в конце главы.

51

2.8. Десятичная арифметика

Необходимый перевод для ЭВМ десятичных чисел в двоичные и обратно требует затраты времени и ресурсов. В цифровых устройствах, где основная часть операций связана не с обработкой и хранением информации, а с самим ее вводом и выводом на какие-либо устройства отображения с десятичным представлением полученных результатов, имеет смысл проводить вычисления в десятичной системе счисления. Но ЭВМ требует информацию только в двоичной форме. Следовательно, десятичные цифры нужно кодировать каким-либо легко реализуемым и быстрым способом. Для этих целей используется двоично-десятичный код, в котором каждая десятичная цифра 0...9 изображается соответствующим 4-разрядным числом (от 0000 до 1001). Такой код называется еще кодом 8421 (цифры, соответствующие весам двоичных разрядов).

Пример.

Представление десятичного числа в двоично-десятичном коде.

( 3 4 7 )(10)

0011 0100 0111

( 347 )(10)=001101000111(2-10)

Две двоично-десятичные цифры составляют 1 байт, т.е. с помощью 1 байта можно представить десятичные числа от 0 до 99.

Действия над двоично-десятичными числами выполняются как над двоичными. Сложности возникают при переносе из тетрады в тетраду.

Кроме того, следует отметить, что выполнение сложения и вычитания двоичнодесятичных чисел со знаком сводится к сложению или вычитанию модулей путем определения фактически выполняемой операции по знаку операндов и виду выполняемой операции. Например, требуется вычислить Z=X-Y при X<0 и Y<0. Тогда выполняется операция |Z|=|Y|-|X|, а затем знак |Z| изменяется на противоположный.

2.8.1.Сложение двоично-десятичных чисел

Воперации сложения двоично-десятичных чисел участвуют только модули чисел. Поскольку код одноразрядных двоично-десятичных чисел полностью совпадает

сих двоичным кодом, никаких проблем при выполнении операции сложения не возникает. Однако многоразрядные двоично-десятичные числа не совпадают с двоичными, поэтому при использовании двоичной арифметики получается результат, в который надо вводить коррекцию. Рассмотрим это подробнее.

Уже отмечалось, что каждая цифра десятичного числа может быть представлена кодом от 0000 до 1001, поэтому если при сложении разряда j двоичнодесятичного числа результат меньше, либо равен 9, то коррекции не требуется, так как двоично-десятичный код результата полностью совпадает с его двоичным кодом.

Пример.

Zj=Xj+Yj = 3(10)+5(10), где j – номер разряда десятичного числа

Xj +0011

1000(2-10)=8(10)=1000(2)

Yj 0101

 

Zj 1000(2-10)

 

Если при сложении j-разрядов чисел результат Zj будет больше или равен 10, то требуется коррекция результата. Рассмотрим, как машина может идентифицировать эту ситуацию. Существуют два варианта.

Вариант 1. Zj=10...15 = (1010...1111)

52

Здесь требуется коррекция, т.е. перенос 1 в старший (j+1) десятичный разряд. Необходимость коррекции в этом случае ЭВМ узнает по чисто формальным признакам:

8

4

2

1

 

r3

r2

r1

r0

 

1

1

-

-

Расположение 1 в четырёх разрядах

1

-

1

-

двоичного числа, которое указывает,

 

 

 

 

что Zj≥10

Эту ситуацию можно описать логическим выражением:

f = (r3 r2 ) (r3 r1 ) =1.

Пример.

Zj=Xj+Yj = 5(10)+7(10) , где j – номер разряда десятичного числа.

Xj +0101

 

 

 

 

5

 

Yj

→ 0111

 

 

 

+7

 

Z

 

 

 

 

 

 

 

 

→ 1100

1

2(10)

j

. .

(2-10)

 

 

 

 

 

 

 

j+1

 

j

Перенос из разряда j

означает в

десятичной системе счисления, что

Z′j = Z j −10 . В то же время в двоичной системе счисления перенос 1 из младшей тетрады в старшую означает, что Z′j = Z j +16 . Следовательно, при коррекции имеет место соотношение

Zjкор = Zj - 10(10) + 16(10) = Zj + 6(10).

Тогда в рассмотренном выше примере

Zjкор → 1100+0110

Zj → 1100

т.о., имеем Zjкор=0010

+

и перенос 1 в j+1 разряд

6(10) 0110

Zjкор → 1← 0010 =12(10)

перенос

Вариант 2. Zj=16,17,18 = (8+8, 8+9, 9+9)

В этом случае из младшей тетрады в старшую происходит перенос 1 или 16(10). Но в десятичной системе счисления переносится в старший разряд только 10. Следовательно, для компенсации в младший разряд следует прибавить 6.

Пример.

Zj=Xj+Yj = 8(10)+9(10) = 17(10), где j – номер разряда десятичного числа.

Xj

+

1000

 

Zj

+ 1 0001

 

Yj

 

1001

 

6(10)

 

0110

=17(10)

Zj

1←

0001

(2-10)

Zjкор

1 0111

перенос

 

 

 

 

 

 

Таким образом, можно сформулировать правило, по которому следует осуществлять коррекцию каждого десятичного разряда результата:

если при сложении многоразрядных двоично-десятичных чисел возник перенос из разряда или f=1, то этот разряд требует коррекции (прибавления 6(10)). При этом корректируются все тетрады последовательно, начиная с младшей.

53

Пример.

Z = X + Y = 927 + 382 = 1309.

X →

1001 0010 0111

 

Y →

0011 1000 0010

 

Z →

1100 1010 1001

 

 

. . . .

 

2-й и 3-й разряды

. . . . . .

 

результата требуют

+

0110

- коррекция 2-й цифры

коррекции, так как f=1

 

 

1 0000 1001

 

 

 

 

+

1101 0000 1001

 

0110

- коррекция 3-й цифры

 

Zкор → 1

0011 0000 1001

 

Zкор =0001 0011 0000 1001(2-10) = 1309(10)

При практической реализации двоично-десятичной арифметики поступают несколько по-другому.

Алгоритм выполнения операции состоит в следующем:

1.Одно из слагаемых представляется в коде с избытком 6, т.е. к каждой тетраде двоично-десятичного числа добавляется число 0110. Избыток не обязательно добавлять к одному из слагаемых. Его можно добавить к результату сложения обоих модулей.

2.Сложение двоично-десятичных модулей выполняется по правилам двоичной арифметики.

3.Если при сложении тетрад получается результат Zj больше или равный 10, то автоматически вырабатывается перенос в следующий разряд (тетраду), по-

скольку фактически Zj≥16. В этом случае результат в данной тетраде получается в естественном двоично-десятичном коде 8421 и коррекции не требуется. Однако, если избыток добавлять к результату сложения модулей, а не к одному из слагаемых, то при выяснении необходимости коррекции следует учитывать переносы как при сложении модулей, так и при добавлении избытка.

4. Если при сложении в каких-либо тетрадах переносы отсутствуют, то для получения правильного результата из кодов этих тетрад необходимо вычесть избыток 6. Это можно сделать двумя способами:

просто вычесть число 0110(2) = 6(10);

сложить с дополнением до 16(10) , т.е. с числом 10(10) = 1010(2). Возникшие при этом межтетрадные переносы не учитываются.

На практике реализуют второй способ.

Пример.

Z = X + Y = 132 + 57 = 189.

X → 0001 0011 0010

+

Y → 0000 0101 0111

Z’→ 0001 1000 1001 - нескорректированное Z

Перед сложением операнды выравниваются по крайней правой тетраде. Теперь надо к Z’ добавить избыток (6(10)):

54

Z’→+0001 1000 1001

избыток → 0110 0110 0110

Z6’→ 0111 1110 1111 - нескорр. избыточное Z

Такой же результат получится, если с избытком +6 взять один из операндов (X или Y). Тогда к результату избыток прибавлять не нужно.

В данном примере при вычислении Z6’ не было переносов из каких-либо тетрад, поэтому необходима коррекция каждой тетрады суммы Z6’. Коррекция производится путем прибавления к каждой тетраде числа 10(10)= 1010(2):

Z6’→ 0111 1110 1111

коррекция → + 1010 1010 1010

Z → 0001 1000 1001

отбросить

переносы → 1

1

1

результат Z=0001 1000 1001(2-10)=189(10)

Пример.

Z = X + Y = -93(10) - 48(10) = -(93+48)(10) = -141(10).

X → 0000 1001 0011

+

Y → 0000 0100 1000

Z’→ 0000 1101 1011 - нескорректированное Z

Перед сложением операнды выравниваются по крайней правой тетраде. После этого к Z необходимо добавить избыток (6(10)):

Z’→+0000 1101 1011 избыток → 0110 0110 0110

Z6’→ 0111 0100 0001 - нескорр. избыточное Z 1 1 - переносы

Такой же результат получится, если с избытком +6 взять один из операндов (X или Y). Тогда к результату избыток прибавлять нет необходимости. В данном примере из двух тетрад переносы существуют, поэтому необходима коррекция только старшей тетрады (из нее нет переноса):

Z6’→ 0111 0100 0001

коррекция →+1010

Z → 0001 0100 0001

перенос → 1 отбросить результат Z = -(0001 0100 0001)(2-10) = -141(10)

Пример.

Z = X + Y = 99(10) + 99(10) = 198(10).

X → 1001 1001

+

Y 1001 1001

Z’ → 1 0011 0010 - нескорректированное Z 1 1 - переносы

При сложении модулей возникли переносы. Добавим избыток:

55

Z’→+0001 0011 0010 избыток → 0110 0110 0110

Z6’→ 0111 1001 1000 - нескорр. избыточное Z

При добавлении избытка 6 переносов не было, однако они имели место при сложении модулей. Их следует учитывать при оценке необходимости коррекции, поэтому, в данном случае, коррекция требуется только для старшей тетрады:

Z6’→ 0111 1001 1000

коррекция →+ 1010

Z → 0001 1001 1000

перенос →

1

отбросить

результат Z=0001 1001 1000(2-10)=198(10)

2.8.2. Вычитание модулей двоично-десятичных чисел

По аналогии с операциями вычитания в двоичном коде операцию X-Y можно представить как X + (-Y). При этом отрицательное число представляется в дополнительном коде, аналогичном дополнительному коду в двоичной арифметике. Этот код используется только для выполнения операций вычитания. Хранятся двоичнодесятичные числа (как положительные, так и отрицательные) в прямом коде со знаком.

Алгоритм выполнения операции состоит в следующем:

1. Модуль положительного числа представляется в прямом двоичнодесятичном коде (8421).

Модуль отрицательного числа – в дополнительном коде (ДК) с избытком 6. Для получения ДК необходимо:

-инвертировать значения разрядов всех тетрад числа;

-к младшему разряду младшей тетрады прибавить 1.

Таким образом, цепочка ПК (mod) → ОК → ОК+1 → ДК аналогична цепочке в двоичной арифметике. Только здесь получается ДК с избытком 6, так как дополнение идет не до 10, а до 16.

2.Произвести сложение операндов (X) в ПК и (Y) в ДК.

3.Если при сложении тетрад возник перенос из старшей тетрады, то он отбрасывается, а результату присваивается знак "+", т.е. результат получается в прямом избыточном коде. Он корректируется по тем же правилам, что и при сложении модулей.

4.Если при сложении тетрад не возникает переноса из старшей тетрады, то результату присваивается знак "-", т.е. результат получается в избыточном ДК. В этом случае необходимо перейти к избыточному ПК (т.е. инвертировать все двоичные разряды двоично-десятичного числа и прибавить к младшему разря-

ду 1).

5.Полученный в этом случае результат в ПК корректируется. Для этого к тем тетрадам, из которых возникал перенос при выполнении пункта 2 (при сумми-

ровании), необходимо добавить 10(10) или 1010(2). Возникшие при этом межтетрадные переносы не учитываются. Таким образом, корректировка происходит в

тех тетрадах, которые в положительных числах не корректируются. Следует отметить, что при выполнении операции вычитания большего числа из меньшего (X - Y = Z, при |X|≤|Y|), т.е. при Z≤0 алгоритм коррекции результата после перевода Z из ДК в ПК требует уточнения. А именно, после перевода Z в ПК необходимость коррекции определяется не только приведенными правилами, но и следующими требованиями:

56

а) нулевой результат не корректируется; б) значащие нули справа в результате не корректируются;

в) если Z≠0 и в нем отсутствуют значащие нули справа (т.е. пп. а, б не имеют места), необходимо анализировать Y. Если в Y есть значащие нули справа, то соответствующие им разряды (тетрады) Z требуют обязательной коррекции, независимо от наличия переносов при сложении XПК и YДК.

Пример.

Z=X-Y=49(10) -238(10) =-189(10).

X → 0000 0100 1001

Y → 0010 0011 1000

Представим |Y| в ДК с избытком 6:

YОК → 1101 1100 0111 + 0001

YДК → 1101 1100 1000

Выполним сложение:

XПК +0000

0100 1001

 

YДК

1101

1100 1000

 

Z’ДК

1110

0001 0001

- нескорректированное Z в ДК

1 1 - переносы

Отсутствие переноса из старшей тетрады является признаком того, что результат получился в ДК (т.е. отрицательный).

Перейдем к нескорректированному избыточному ПК:

Z’ДК → 1110 0001 0001

ZДК → 0001 1110 1110 + 0001

Z’ПК → 0001 1110 1111 - нескорректированное Z в ПК

Произведем коррекцию результата в соответствии с п. 5 алгоритма:

Z’ПК +0001 1110 1111 коррекция → 0000 1010 1010 0001 1000 1001

переносы →

1

1 отбросить

результат |Z|= (0001 1000 1001) = 189(10)

Поскольку ранее результат получался в ДК, т.е. отрицательный, необходимо добавить знак (-). Окончательный результат будет следующий:

Z= -(0001 1000 1001) = -189(10)

Пример.

Z=X-Y=143(10) -58(10) =85(10).

X → 0001 0100 0011

Y → 0000 0101 1000

Представим |Y| в ДК с избытком 6:

YОК → 1111 1010 0111 + 0001

YДК → 1111 1010 1000

57

Выполним сложение:

XПК → 0001 0100 0011

YДК +1111 1010 1000

Z’ПК → 0000 1110 1011 - нескорректированное Z в ПК

- перенос отбросить

1

Наличие переноса из старшей тетрады указывает на то, что результат получился в ПК (т.е. положительный).

Произведем коррекцию результата в соответствии с п. 3 алгоритма:

Z’ПК +0000 1110 1011

коррекция → 1010 1010 0000 1000 0101

переносы →

1

1 отбросить

результат Z= 1000 0101(2-10)=85(10)

2.8.3. Умножение модулей двоично-десятичных чисел

Операция умножения сводится к образованию и многократному сложению частичных двоично-десятичных произведений.

Алгоритм выполнения операции состоит в следующем:

1.Сумма частичных произведений полагается равной нулю.

2.Анализируется очередная тетрада множителя, и множимое прибавляется к сумме частичных произведений столько раз, какова цифра, определяемая этой тетрадой.

3.Сумма частичных произведений сдвигается на одну тетраду, и повторяются действия, указанные в п. 2, пока все цифры (тетрады) множителя не будут обработаны. Направление сдвига зависит от того, какой вариант перемножения выбран – "старшие разряды вперед" или "младшие разряды вперед".

4.Каждая операция суммирования завершается десятичной коррекцией, соответствующей случаю суммирования двоично-десятичных чисел без избытка 6 (т.е. необходимо добавить 0110 к тем тетрадам, из которых был перенос или в которых f=1).

Пример.

Z = X * Y = 25(10) * 13(10) = 325(10).

X = 25(10) = 0010 0101(2-10); Y = 13(10) = 0001 0011(2-10).

Для решения примера выберем вариант перемножения "старшие разряды вперед". В соответствии с п. 1 алгоритма полагаем сумму частичных произведений P0=0. (Частичные произведения будем обозначать Pi).

Y = 0001 0011

 

X = 0010 0101

← P0=0

1(10)

+

0000 0000

 

0010

0101

← P1 (1-е част. произв.)

 

 

 

 

 

← Σ1=P0 + P1=P1 - коррекции

+ 0010 0101 0000

не требует

← Сдвиг влево

3(10)

+

 

0010

0101

 

 

0010

0101

← P2 (2-е част. произв.)

 

+

 

0010

0101

 

58

Формирование второго частичного произведения - более длительная операция, поскольку вторая анализируемая тетрада содержит 3(10), поэтому каждая операция суммирования требует проверки необходимости коррекции. Вычислим P2, последовательно суммируя слагаемые, образующие P2:

Х →

+0010 0101

 

Х →

0010

0101

 

P'2 неп.

0100

1010

 

 

 

+

. .

 

 

 

. . .

 

 

 

 

 

коррекция →

0000

0110

 

P2 неп.

 

0101

0000

 

Х →

+0010 0101

 

P2

0111

0101

 

первое слагаемое Р2

второе слагаемое Р2

неполное, нескорректированное Р2

тетрада требует коррекции (f=1)

неполное, скорректированное Р2

третье слагаемое Р2

полное Р2. Коррекции не требует

Таким образом, второе частичное произведение, состоящее из трех слагаемых, имеет вид

P2 = 0111 0101.

Теперь можно вычислить сумму первого и второго частичного произведений, т.е. результат:

P1

0010 0101 0000

← первое сдвинутое частичное произведение

P2

+

0111 0101

← второе частичное произведение

 

 

0010 1100 0101

нескорректированный результат

2=P1+P2

+

. .

 

 

 

. . .

← тетрада требует коррекции. (f=1)

 

 

 

коррекция → 0000 0110 0000

 

 

2=P1+P2

→ 0011 0010 0101

← скорректированный результат

Окончательный результат: Z = 0011 0010 0101(2-10) = 325(10).

Следует отметить, что в данном случае при суммировании операндов не возникало переносов, поэтому коррекция осуществлялась только по признаку f=1.

2.8.4. Деление модулей двоично-десятичных чисел

Операция деления выполняется путем многократного вычитания, сдвига и анализа результата подобно тому, как это делается при обычном делении. В настоящем курсе эта операция не рассматривается. Информация о ней может быть найдена в литературе, приведенной в конце главы.

2.9. Нарушение ограничений ЭВМ

При выполнении арифметических операций возможны ситуации, когда нарушаются ограничения, связанные с конечной длиной разрядной сетки ЭВМ. При этом

вЭВМ формируются признаки соответственно:

для ЧФЗ:

-переполнение, когда результат не вмещается в отведенное количество бит (имеются в виду ЧФЗ справа от МЗР);

для ЧПЗ:

-положительное переполнение порядка, когда PZ>Pmax;

-отрицательное переполнение порядка, когда PZ<Pmin (исчезновение порядка). Конкретная реакция различных ЭВМ и различных операционных систем на при-

знаки нарушения ограничений в общем случае различна. Однако все они обязательно выполняют следующие операции:

59