Умножение чисел с фиксированной запятой в прямом и дополнительном кодах
Умножение чисел с фиксированной запятой имеет несколько вариантов, каждый из которых влияет на те или иные характеристики ЭВМ и, соответственно, должен быть принят во внимание при ее проектировании или анализе ее работы.
Умножение чисел c фиксированной запятой на 2 в степени ±k
Умножение двоичных чисел на целую степень числа два, казалось бы, не представляет существенных сложностей. Но при машинном выполнении этого действия необходимо учитывать ряд моментов, среди которых форма представления числа, разрядность используемой машинной сетки, код, в котором записано данное число и некоторые другие.
Данное действие используется как при выполнении операции умножения, так и деления чисел в различных кодах и с использованием разных алгоритмов.
Умножение чисел c фиксированной запятой на 2 в степени +k
Данное действие соответствует увеличению двоичного числа в k раз, что равносильно его сдвигу влево на k разрядов. При этом необходимо учесть следующие моменты:
- не произойдет ли переполнение разрядной сетки числа, то есть не станет ли число с фиксированной запятой больше единицы;
- как заполняются освобождающиеся справа разряды числа.
Для положительных чисел их представление в прямом, обратном и дополнительном кодах совпадают (Рис.8.1).
Поэтому умножение числа на 2+k для всех кодов происходит аналогичным образом. Очевидно, что для положительного числа данное действие приведет к переполнению (число превысит единицу) лишь при условии k > s.
Освобождающиеся справа разряды заполняются нулями (Рис.8.2):
Рис. 8.2. Положительное число с фиксированной запятой после его корректного умножения на 2 в степени +k
Для отрицательных чисел умножения на 2+k зависит от того, в каком коте это число представлено.
Для чисел, записанных в прямом коде, умножение не приведет к переполнению разрядной сетки в случае, если первые s разрядов числа были единицами, и выполнялось условие s > k (Рис.8.3). При этом освобождающиеся справа разряды заполняются нулями.
Рис. 8.3. Умножение отрицательного числа с фиксированной запятой, заданного в прямом коде на 2 в степени +k
Умножение чисел c фиксированной запятой на 2 в степени -k
Так же, как и при умножении двоичного числа с фиксированной запятой на 2+k, умножение на 2-k сводится к его сдвигу, но уже в другую сторону – вправо на k разрядов. Очевидно, что в данном случае переполнения произойти не может, но большое значение приобретает код, в котором записано число.
Для чисел, заданных в прямом коде, выполняется, так называемый, логический сдвиг, при котором знак числа остается на месте, а освобождающиеся за знаком позиции заполняются нулями. При этом цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.4).
Рис. 8.4. Организация логического сдвига числа вправо на i разрядов (умножение на 2 в степени -i числа в прямом коде)
Если же число задано в дополнительном коде, то его умножение на 2-i (сдвиг вправо на i разрядов) проводится по схеме арифметического сдвига. При этом число сдвигается вправо вместе со своим знаком. Знак остается на месте.
Цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.5).
Рис. 8.5. Организация арифметического сдвига числа вправо на i разрядов (умножение на 2 в степени -i числа в дополнительном коде)
Умножение чисел, заданных в прямом коде
Рассмотрим вариант умножения операндов, представленных в прямом коде. Числа с фиксированной запятой в прямом коде записываются согласно выражению (7.1). Поэтому запишем множимое как , а множитель как . Тогда произведение нам необходимо получить в виде
и действие распадается на два самостоятельных действия: получение знака произведения и получение модуля его числовой части.
Знак произведения определяется обычным образом как сумма по модулю 2 знаков сомножителей:
( 8.1) |
Теперь запишем формулу (точнее, формулы) для вычисления модуля произведения.
Преобразуя эту формулу, получим
( 8.2) |
которая приводит к алгоритму умножения со старших разрядов множителя, или к формуле
( 8.3) |
которая показывает последовательность действий при умножении с младших разрядов множителя.
Прежде чем подробно рассматривать примеры, иллюстрирующие каждый из этих алгоритмов, остановимся на некоторых общих для обоих алгоритмов моментах.
Во-первых, отметим, что мы имеем дело с двоичными числами. В связи с этим, yi может принимать только два разных значения: "ноль" либо "единица". В первом случае величина не участвует в формировании частичного произведения на соответствующем шаге умножения, а во втором случае – участвует.
Такой сдвиг реализуется на основе сдвигового регистра (см. "Схемотехническая реализация элементов вычислительной техники" ). При этом разряды, выходящие за пределы разрядной сетки, теряются (но в полноразрядной сетке такого произойти не может).
Пример 8.1.
В-третьих, следует сказать о разрядности используемых в операции операндов, произведения и разрядной сетки, в которой необходимо проводить необходимые действия по его получению.
ЭВМ работает с операндами равной длины. Если длины операндов не совпадают, то операнд, имеющий меньшую длину, расширяется знаком до разрядности операнда с большей длиной. Поэтому будем считать, что оба операнда имеют длину в n числовых разрядов. В этом случае мы получим 2n разрядное произведение (не считая одного разряда, отводимого под знак числа).
Получение результата с точностью, превосходящей точность исходных данных, бессмысленно. В литературе показано [...], что в случае n разрядных операндов необходимая точность получается для чисел в формате с фиксированной запятой для результата в укороченной разрядной сетке, содержащей n + d разрядов, где d ≥ log2n.Так, для чисел, имеющих четыре разряда в цифровой части, можно проводить умножение в разрядной сетке 4 + log24 = 6 разрядов. Но, во-первых, это потребует проведения округления на каждом шаге вычисления произведения. А, во-вторых, возникают вопросы: "Что делать с полученным числом, которое имеет длину больше, чем длина операнда, но меньше, чем удвоенная длина операнда? Как его хранить в памяти? Как использовать в последующих операциях?" В силу этого и ряда других моментов укороченная разрядная сетка при выполнении так называемых "длинных" операций (умножения и деления) в универсальных компьютерах не применяется, и мы при рассмотрении примеров выполнения умножения и деления ею пользоваться не будем.