Россия, г. Москва |
Умножение чисел с фиксированной запятой в прямом и дополнительном кодах
Умножение со старших разрядов множителя чисел, заданных в прямом коде
Напомним, что при реальной записи числа в памяти ЭВМ какие-либо символы, отделяющие знак от цифровой части числа, отсутствуют. Так что в данном случае мы имеем дела с пятиразрядным числом, включающим знак и четыре цифровых разряда.
Так как в прямом коде знак произведения и его модуль формируются отдельно, то следует обсудить лишь вопросы, касающиеся количества разрядов, отводимых под хранение мантисс сомножителей и мантиссы произведения.
Мы уже отмечали, что произведение следует получать в 2n-разрядной сетке, где n – количество разрядов у операндов.
Умножение со старших разрядов множителя заключается в том, что за время умножения на один разряд множителя происходит два действия:
- к сумме частичных произведений (СЧП) добавляется , сдвинутый вправо на количество разрядов, соответствующее анализируемому знаку множителя, либо добавляется ноль, если анализируемый знак множителя был равен нулю;
- регистр сдвига, хранящий , сдвигается вправо на 1 разряд.
В силу того, что в операции должны участвовать операнды одинаковой разрядности, а разрядность результата, равна 2n, то и изначально должен храниться в регистре длиной 2n, в котором младшие n позиций заполнены нулями. Также изначальное значение СЧП тоже должно быть равно нулю и изначально все ее позиции должны быть заполнены нулями. Для СЧП может быть выбран обычный регистр хранения: исходя из формулы (8.2) его значение сдвигам не подвергается.
Регистр, хранящий , в процессе выполнения умножения интересен не как единое целое, а как набор отдельных разрядов, хранящих значения yi, использующихся при формировании очередного СЧП. Получение очередного значения yi в следующем такте формирования СЧП может быть выполнено разнообразными схемотехничекими решениями, наиболее рациональным из которых представляется хранение в n-разрядном регистре сдвига, его сдвиге в сторону старших разрядов после анализа очередного разряда и снятии старшего разряда этого регистра в каждом такте для анализа очередного разряда yi.
Таким образом, мы получаем следующие схемотехнические требования к регистрам, которые хранят модули операндов и результата:
- RG |X| – разрядность 2n, возможность сдвига вправо;
- RG |Y| – разрядность n, возможность сдвига влево;
- RG СЧП (RG |Z|) – разрядность 2n c возможностью первоначальной установки в ноль.
Пример 8.2.
Умножить два числа с фиксированной запятой, заданных в прямом коде, со старших разрядов множителя: Xпк = 1.0110, Yпк = 0.1010.
Исходя из вышесказанного, выполнение данного примера будет складываться из следующих этапов.
- Определяем знак произведения согласно формуле (8.1):
- Определяем модуль произведения согласно формуле (8.2):
Так как в формировании произведения участвует , сдвинутый на соответствующее число разрядов вправо, то для наглядности будем представлять его в виде отдельного столбца значений.
- Получаем итоговый результат Z = 1.00111100пк
На основе данного примера рассмотрим еще один момент, отражающий связь между используемым при выполнении арифметических действий алгоритмом и особенностями организации ЭВМ. При умножении со старших разрядов множителя чисел, заданных в прямом коде, к значению СЧП, полученному на очередном шаге, в зависимости от значения очередного разряда yi добавляется либо , сдвинутый на соответствующее количество разрядов вправо, либо ноль. Добавления ноля, казалось бы, только замедляет выполнение операции (в половине случаев такое сложение бессмысленно). Однако, и тот, и другой вариант действий может быть использован. Первый вариант носит название варианта без пропуска такта суммирования, а второй, соответственно, с пропуском такта суммирования.
В качестве преимущества первого варианта мы отметили устранение операции суммирования с нулем, которое не приводит к изменению предыдущего значения СЧП. Но при этом у нас изменяется регулярность последовательности тактов выполнения операции умножения, а само значение yi должно быть передано и проанализировано устройством управления компьютера, которое является сложной и нерегулярной схемой. В то же время прибавление нуля к СЧП (при yi = 0) можно осуществить достаточно просто. Фрагмент такого действия показан на Рис. 8.6. Более подробно арифметико-логическое устройство, реализующее такой алгоритм умножения, показано в [ ].
Рис. 8.6. Управление передачей |X|•2 в степени -i на сумматор СЧП в алгоритме без пропуска такта суммирования
Умножения с младших разрядов множителя чисел, заданных в прямом коде
Данное умножение реализуется согласно формуле (8.3). Суть этой формулы проста: к СЧП, полученной на предыдущем шаге добавляется , умноженный на значение соответствующего разряда yi, а затем полученное новое значение сдвигается вправо на 1 разряд. Нюанс этого алгоритма как раз и заключается в этом сдвиге, завершающем формирование очередного значения СЧП.
Так как для данного формата |X| > 1 и |Y| < 1, то их произведение тоже не превышает единицы, и в процессе вычислений никаких особых мер предосторожности применять не нужно. Но так как каждый шаг обработки очередного разряда множителя заканчивается умножением полученной перед этим суммы на 2-1, то есть фактически ее уменьшением в два раза, то это означает, что в процессе умножения вплоть до самого последнего этапа при сложении возможно получение числа, превышающего единицу. Это возможное превышение как раз и компенсируется сдвигом.
Для корректного пошагового выполнения умножения по этому алгоритму рекомендуется применять модифицированный код. При этом сдвиг числа, заданного в модифицированном коде, на i разрядов вправо (умножение на 2-i) проводится по схеме, представленной на Рис.8.7:
Пример 8.3.
Выполнить умножение с младших разрядов множителя следующих чисел с фиксированной запятой, заданных в прямом коде:
Xпк = 1.1101
Yпк = 1.1011
Решение.
Умножение со старших разрядов множителя чисел, заданных в дополнительном коде
Выполнение операции умножения в случае, когда сомножители заданы в дополнительном коде, имеет другую структуру, нежели умножение в прямом коде. Главное отличие состоит в том, что в формировании произведения участвуют сомножители целиком, вместе со своими знаками. Произведение также формируется вместе со знаком.
При выполнении операции умножения со старших разрядов множителя формула (8.2) приобретает следующий вид:
( 8.3) |
Эта формула имеет следующие особенности:
- y0 – знаковый разряд множителя;
- yn+1 – фиктивный разряд расширения длины множителя, который для дополнительного кода всегда принимается равным нулю (при этом значение самого числа вне зависимости от его знака не меняется);
- (yi+1-yi) может принимать значения нуля (при равенстве соседних разрядов множителя), (+1) или (-1). В двух последних случаях при получении СЧП необходимо к предыдущему значению СЧП добавлять сдвинутые на соответствующее количество разрядов вправо Xдк или (-Xдк) в первом и втором случае соответственно;
- так как в дополнительном коде можно представить на одно отрицательное число больше, чем в прямом коде и на последнем шаге сдвиг вправо результата не выполняется, то процесс умножения можно проводить в обычном, а не модифицированном коде.
Рассмотрим это на следующем примере.
Пример 8.4.
Выполнить умножение со старших разрядов множителя следующих чисел с фиксированной запятой, заданных в дополнительном коде: Xдк = 1.0011; Yдк = 1.1011