Схема Горнера в этом случае имеет вид
[C]o=[A]o ´ (b12-1+b22-2+…+bn2-n – SgB + SgB2-n)= =SgB[ ` A]o+2-1(b1 [A]o+2-1 (b2[A]o+…+2-1(bn [A]o+SgB[A]o+0))…) | (9) |
При сложении в обратном коде единица, спадающая со знакового разряда подсуммируется в младший разряд произведения в том же такте. Поэтому в этой схеме требуется двойная точность сумматора и РгА. Рассмотрим пример умножения, приняв следующие значения операндов: А=-0.1101, В=-0.1011. В соответствии с изложенным выше, коды операндов имеют вид:
[A]o=11.0010 1111, [B]o=1.0100. Процедура умножения в соответствии с алгоритмом (7) приведена в таблице 9.
Таблица 9 Умножение на ДСОК, схема 2
СМ | РгВ | СТ | Комментарии |
11.1111 1111 + 11.0010 1111 11.0010 1110 + 1 11.0010 1111 | 1.0100 | 4 | СМ:=0, РгА:=[A]om|1111, РгВ:=[B]o, СТ:=4, |
SgB=1? Да Выполняем первую коррекцию. СМ:=СМ+РгА, | |||
11.1001 0111 | 1 1.010 | 3 | РгВ[4]=1? НЕТ Пропускаем такт подсуммирования. Выполняем сдвиги. РгВ:=R(1)РгВ, СМ:=R(1)СМ, СТ:=СТ-1, |
11.1100 1011 + 11.0010 1111 10.1111 1010 + 1 10.1111 1011 | 11 1.01 | 2 | СТ=0? НЕТ РгВ[4]=1? НЕТ Пропускаем такт подсуммирования. Выполняем сдвиги. РгВ:=R(1)РгВ, СМ:=R(1)СМ, СТ:=СТ-1, |
СТ=0? НЕТ РгВ[4]=1? ДА СМ:=СМ+РгА, | |||
11.0111 1101 | 111 1.0 | 1 | Выполняем сдвиги. РгВ:=R(1)РгВ, СМ:=R(1)СМ, СТ:=СТ-1, |
11.1011 1110 +00.1101 0000 00.1000 1110 + 1 00.1000 1111 | 1111 1. | 0 | СТ=0? ДА Проверяем значение знака РгВ. РгВ[4]=1? ДА Выполняем коррекцию СМ:=СМ+Рг`А, |
Ответ: [C]o=00.1000 1111.
Примечания.
1. Так как при умножении всегда получается двойная точность результата, которой соответствует двойная точность сумматора, переполнение разрядной сетки не возникает. Однако в схеме 2 используется модифицированный код, так как переполнение разрядной сетки может возникать в частичных произведениях, которое устраняется при последующем сдвиге сумматора вправо. Во всех остальных схемах умножения применение модифицированного кода не требуется.
2. Схема 2 умножения является единственной, в которой при умножении в дополнительном коде может использоваться сумматор одинарной точности. При этом, как видно из приведенной выше примера, младшие разряды произведения накапливаются в старших разрядах регистра множителя и сдвигаются вместе с ним, так что старшие разряды в конце операции умножения находятся в сумматоре, а младшие в регистре множителя. При умножении в обратном коде применение такого приема невозможно, так как при умножении в обратном коде единица переноса из знакового разряда сумматора должна подсуммироваться в младший разряд суммы. Поэтому при умножении по схеме 2 на ДСОК используется сумматор двойной точности и модифицированный код.
Умножение двоичных чисел с фиксированной запятой на ДСДК, схема 3
Схема Горнера в этом случае имеет вид:
[ C ]д = [ A ]д ( b 1 2-1+ b 2 2-2+…+ bn 2- n -1)=( [ A ]д *2- n ) ( b 1 2 n -1 + b 2 2 n -2 +…+ bn -1 2+ bn – SgB 2 n )=[ A ` ]д ´ ( b 1 2 n -1 + b 2 2 n -2 +…+ bn -1 2+ bn – SgB 2 n )= =SgB([ ` A‘] д 2n)+b1([A‘] д 2n-1)+b2([A‘] д 2n-2 )+…+bn-1([A‘] д 2)+n [A‘] д | (10) |
Из выражения (10) следует, что
1. множимое в начале выполнения операции сдвигается на n разрядов вправо; поэтому регистр А должен иметь двойную точность;
2. при умножении на отрицательный множитель выполняется одна коррекция в конце выполнения операции умножения;
3. разряды множителя анализируются, начиная с младшего разряда;
4. множимое в каждом цикле умножения сдвигается на один разряд влево.
Пример. Пусть А=0,1101, В=-0,1011. С учетом сказанного выше, в РгА после сдвига на n=4 разрядов вправо находится число 0,0000 1101, дополнительный код множителя находится в регистре В. [B]д =1.0101. Процедура выполнения умножения приведена в таблице 10.
Таблица 10 Умножение на ДСДК, схема 3
СМ | РгА | РгВ | СТ | Комментарии |
0.0000.0000 | 0.0000.1101 | 1.0101 | 4 | СМ:=0, РгА:= [A ‘]д, РгВ:= [В]д, СТ:=4, |
+0.0000.1101 0.0000.1101 | РгВ[4]=1? ДА СМ:=СМ+РгА, | |||
0.0001 1010 | -1.010 | 3 | СТ=0? НЕТ РгА:=L(1) РгА, РгВ:=R(1)РгВ, СТ:=СТ-1, | |
0.0011 0100 | --1.01 | 2 | РгВ[4]=1? НЕТ Пропускаем такт подсуммирования. Выполняем сдвиги РгА и РгВ и декремент счетчика. | |
0.0000 1101 +0.0011 0100 0.0100 0001 | РгВ[4]=1? ДА СМ:=СМ+РгА, | |||
0.0110 1000 | ---1.0 | 1 | СТ=0? НЕТ РгА:=L(1) РгА, РгВ:=R(1)РгВ, СТ:=СТ-1, | |
0.1101 0000 | ----1. | 0 | РгВ[4]=1? НЕТ Пропускаем такт подсуммирования. Выполняем сдвиги РгА и РгВ и декремент счетчика. | |
0.0100 0001 +1.0011 0000 1.0111 0001 | СТ=0? ДА Проверяем значение знака В. Так как SgB=1, выполняем коррекцию. СМ:=СМ+Рг`А, |
Ответ: [C]д=1.0111 0001. Или в естественной записи С= -0.1000 1111.
Дата: 2018-12-28, просмотров: 269.