Умножение в дополнительных кодах
Умножение чисел в дополнительных кодах может выполняться по любому из рассмотренных выше четырех алгоритмов, но отличается тем, что для получения верного результата необходимо вводить поправки. Умножение правильных дробей и целых чисел имеет некоторые различия.
Рассмотрим вначале умножение дробных чисел. Возможны четыре случая знакосочетания сомножителей.
1) Мн>0,
Мт>0.
В этом случае дополнительный код сомножителей совпадает с прямым кодом и умножение выполняется по правилам умножения в прямых кодах, в результате чего получается верный результат.
2) Мн>0,
Мт<0.
Так как Мн и Мт имеют разные знаки, то результат будет иметь отрицательный знак. Следовательно, результат должен быть представлен в дополнительном коде [Мн∙Мт]доп=2-Мн∙Мт. Для формирования произведения выполним умножение Мн на Мт¢ (дополнение):
Мн∙Мт¢= Мн ∙(1 - Мт)= Мн - Мн∙Мт.
Таким образом, погрешность Δ умножения равна разности [Мн∙Мт]доп. и Мт∙Мн¢
Δ=2-Мн∙Мт- Мн + Мн∙Мт=2-Мн=[-Мн]доп=[ [Мн]доп]доп
и должна быть внесена в полученный результат в качестве поправки.
Пример: Мн = 0,1011 (алгоритм умножения А)
Мт = - 0,1101
Δ= [- Мн]доп = 1,0101
[- Мт]доп = 1,0011
0,0000
+ 0,1011 = Мн b4
0,1011
0,0101 1 ∙ 2-1
+ 0,1011 = Мн b3
1,0000 1 (произошло переполнение)
0,1000 01 ∙ 2-1 (коррекция)
0,010 0001 ∙ 2-1 ( ∙ 2-1) ∙ 2-1
0,0010 0001 ∙ 2-1 (( ∙ 2-1 )∙ 2-1)∙ 2-1
+ 1,0101 Δ = [- Мн]доп (поправка)
1,0111 0001 =[Mн ∙ Mт]доп
- 0,1000 1111 Mн ∙ Mт
В этом примере, а также в некоторых примерах, следующих ниже, происходит переполнение разрядной сетки, в результате которого искажаются и знаковая и значащая часть числа. Для коррекции (восстановления верного значения) производится немодифицированный сдвиг. В результате этого знаковый разряд сдвигается в значащую часть, а знаковый разряд меняет свое значение на противоположное.
3) Mн<0,
Mт>0.
Аналогично предыдущему случаю
[Мн∙Мт]доп=2-Мн∙Мт,
Мн¢∙Мт= (1 - Мн)∙Мт= Мт - Мн∙Мт.
Таким образом, погрешность умножения равна разности [Мн Мт]доп и Мт∙Мн¢.
Δ=2-Мн∙Мт- Мт + Мн∙Мт=2-Мт=[-Мт]доп=[ [Мт]доп]доп.
Использовать этот вариант неудобно, так как нужно вводить поправку [-Mт]доп в конце умножения, а в результате сдвигов Мт постепенно исчезает на регистре множителя и для поправки нужно либо вводить дополнительный регистр, либо вносить поправку в сумматор на первом такте умножения.
При этом знакосочетании возможно умножение без ввода поправки. Рассмотрим этот вариант на примере умножения по алгоритму Г (это справедливо и для других алгоритмов).
Мн∙Мт = А ∙ В = [ A ∙ b1∙ 2-1 ]доп + [ A ∙ b2∙ 2-2 ]доп+ ... + [A∙ bn∙ 2-n ]доп .
На основании теоремы, доказывающей что сумма дополнительных кодов есть дополнительный код суммы, получаем
[ A ∙ b1∙ 2-1 + A ∙ b2∙ 2-2 + ... + A∙ bn∙ 2-n ]доп = [Мн ∙Мт]доп.
В этом случае поправка вводится автоматически на каждом этапе умножения.
Пример: Mн = -0,1011
Mт = 0,1101
|
0,00000000
+ 1,10101000 = [Mн ∙ b1 ∙ 2-1]доп
1,10101000
+ 1,11010100 = [Mн ∙ b2 ∙ 2-2]доп
1,01111100
+ 1,11110101 = [Mн ∙ b4 ∙ 2-4]доп
1,01110001 [Mн ∙ Mт]доп
-0,10001111 Mн ∙ Mт
4) Mн<0,
Mт<0.
Mн ∙ Mт = 2 - [Mн ∙ Mт]доп
[Mн]доп ∙ (1 - Mт) = [Mн]доп - [Mн]доп ∙ Mт = [Mн]доп - [Mн ∙ Mт]доп
Δ=2 - [Mн ∙ Mт]gдоп - [Mн]доп + [Mн ∙ Mт]доп = 2 - [Mн]доп = [[Mн]доп]доп
Пример: Mн = - 0,1011 умножение будем выполнять
Mт = - 0,1101 по алгоритму умножения Г
[Mн]доп = 1,0101
[Mт]доп = 1,0011
Δ =[-Mн]доп = 0,1011
0,00000000
+ 1,11101010 = [Mн ∙ b3 ∙ 2-3]доп
1,11101010
+ 1,11110101 = [Mн ∙ b4 ∙ 2-4]доп
1,11011111
+ 0,10110000 Δ (поправка)
0,10001111 [Mн∙ Mт]доп
Далее коротко остановимся на умножении целых чисел. При представлении целых чисел в дополнительном коде знаковый разряд входит в число n разрядов. Следовательно, при умножении целых чисел (в отличие от дробных) в дополнительных кодах знаковый разряд участвует в умножении наряду со значащими. То есть умножение ведется на [Mт]доп , а не на Мт¢.
1) Mн > 0,
Mт > 0.
Как отмечалось выше, в этом случае умножение выполняется по правилам умножения чисел в прямых кодах.
2) Мн>0,
Mт<0,
[Мт]доп = 2n – Мт.
Так как сомножители имеют разные знаки, то произведение Мн∙Мт<0, следовательно, [Mн∙Мт]доп=22n - Mн∙Мт. Однако при умножении Мн∙[Мт]доп получается Mн ∙(2n-Mт) =2n Mн - Mн∙Мт. Следовательно, погрешность в этом случае равна Δ = 22n–Mн∙Мт–2n Mн+Mн∙Мт = 22n–2n Mн = [–Мн]доп∙22n = [ [Мн]доп]доп∙22n.
Пример: Mн = +110
Mт = -101
[Mн]доп = 0.110
[Mт]доп = 1.011
= [- Mн]доп = 1.010
0.000
+ 0.110 = Mн∙b4
0.110
0.011 0 ∙2-1
+ 0.110 = Mн∙b3
1.001 0 (возникло переполнение)
0.100 10 ∙2-1 (коррекция)
0.010 010 ∙2-1
+ 0.110 = Mн∙b1
1.000 010 (возникло переполнение)
0.100 0010 ∙2-1 (коррекция)
+ 1.010 (поправка)
1.110 0010 [Mн×Mт]доп
- 001 1110 Mн×Mт
3) Мн<0,
Мт>0.
Здесь, как и при умножении дробных чисел, возможны два случая:
a) с вводом поправки в получаемое произведение
[Мн]доп = 2n – Mн.
Как и ранее, требуется получить [Мн∙Мт]доп= 22n - Мн∙Мт. Получаем
(2n - Мн) ∙ Мт = 2n ∙ Мт - Мн∙Мт.
= 22n - Мн∙Мт - 2n ∙ Мт + Мн∙Мт = 2n(2n - Мт) = [-Мт]доп ∙ 2n ;
б) вариант без ввода поправки рассмотрим применительно к алгоритму умножения Г (как и ранее это справедливо и для других алгоритмов):
Mн∙Mт = A∙B = [A ∙ b1 ∙ 2-1 ]доп + [A ∙ b2 ∙ 2 -2]доп+- ... + [A ∙ bn ∙ 2-n]доп=
=[A ∙ b1 ∙ 2-1 + A ∙ b2 ∙ 2 –2 +- ... + A ∙ bn ∙ 2-n]доп=[Мн∙Мт]доп.
Пример: Мн = -110 Мт = 101 [Мн]доп = 1.010
[Мт]доп = 0.101
b1 ... b4
0.0000000
+ 0.0000000 = [MH ∙ b1]доп ∙ 2-1
0.0000000
+ 1.1101000 = [MH ∙ b2]доп ∙ 2-2
1.1101000
+ 1.1111010 = [MH ∙ b4]доп ∙ 2-4
1.1100010
4) Mн < 0
Mт < 0
При этом сочетании знаков сомножителей в результате должно быть получено:
[Mн]доп = 2n – Mн,
[Mт]доп = 2n – Mт,
Mн ∙Mт = 22n - [Mн Mт]доп.
При умножении [Mн]доп∙[Mн]доп получается:
[Mн]доп∙[Mн]д =[Mн]доп ( 2n - Mт ) = 2n [Mн]доп -
Пример: Мн = -110
Mт = -101
[Mн]доп = 1.010
[Mт]доп = 1. 011
b1 ... b4
= [[Mн]доп]доп= 0.110
При умножении используем алгоритм Г.
0.0000000
1.1010000 = [Mн∙b1]доп∙2-1
1.1010000
1.1110100 = [Mн∙b3] доп∙2-3
1.1000100
1.1111010 = [Mн∙b4] доп∙2-4
1.0111110
0.110 (поправка)
0.0011110 Mн Mт
Дата добавления: 2016-01-09; просмотров: 1755;