Опубликован: 05.06.2018 | Доступ: свободный | Студентов: 706 / 178 | Длительность: 07:59:00
Лекция 8:

Умножение чисел с фиксированной запятой в прямом и дополнительном кодах

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Аннотация: Цель лекции: представить алгоритмы умножения операндов, представленных в различных кодах, провести их сравнение, показать особенности их использования в ЭВМ. Ключевые слова: умножение со старших разрядов множителя, умножение с младших разрядов множителя, умножение с пропуском такта суммирования, умножение в прямом коде, умножение в дополнительном коде, укороченная разрядная сетка.

Умножение чисел с фиксированной запятой имеет несколько вариантов, каждый из которых влияет на те или иные характеристики ЭВМ и, соответственно, должен быть принят во внимание при ее проектировании или анализе ее работы.

Умножение чисел c фиксированной запятой на 2 в степени ±k

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

Данное действие используется как при выполнении операции умножения, так и деления чисел в различных кодах и с использованием разных алгоритмов.

Умножение чисел c фиксированной запятой на 2 в степени +k

Данное действие соответствует увеличению двоичного числа в k раз, что равносильно его сдвигу влево на k разрядов. При этом необходимо учесть следующие моменты:

  • не произойдет ли переполнение разрядной сетки числа, то есть не станет ли число с фиксированной запятой больше единицы;
  • как заполняются освобождающиеся справа разряды числа.

Для положительных чисел их представление в прямом, обратном и дополнительном кодах совпадают (Рис.8.1).

Положительное число с фиксированной запятой до его умножения на 2 в степени +k

Рис. 8.1. Положительное число с фиксированной запятой до его умножения на 2 в степени +k

Поэтому умножение числа на 2+k для всех кодов происходит аналогичным образом. Очевидно, что для положительного числа данное действие приведет к переполнению (число превысит единицу) лишь при условии k > s.

Освобождающиеся справа разряды заполняются нулями (Рис.8.2):

Положительное число с фиксированной запятой после его корректного умножения на 2 в степени +k

Рис. 8.2. Положительное число с фиксированной запятой после его корректного умножения на 2 в степени +k

Для отрицательных чисел умножения на 2+k зависит от того, в каком коте это число представлено.

Для чисел, записанных в прямом коде, умножение не приведет к переполнению разрядной сетки в случае, если первые s разрядов числа были единицами, и выполнялось условие s > k (Рис.8.3). При этом освобождающиеся справа разряды заполняются нулями.

Умножение отрицательного числа с фиксированной запятой, заданного в прямом коде на 2 в степени +k

Рис. 8.3. Умножение отрицательного числа с фиксированной запятой, заданного в прямом коде на 2 в степени +k

Умножение чисел c фиксированной запятой на 2 в степени -k

Так же, как и при умножении двоичного числа с фиксированной запятой на 2+k, умножение на 2-k сводится к его сдвигу, но уже в другую сторону – вправо на k разрядов. Очевидно, что в данном случае переполнения произойти не может, но большое значение приобретает код, в котором записано число.

Для чисел, заданных в прямом коде, выполняется, так называемый, логический сдвиг, при котором знак числа остается на месте, а освобождающиеся за знаком позиции заполняются нулями. При этом цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.4).

Организация логического сдвига числа вправо на i разрядов (умножение на  2 в степени -i числа  в прямом коде)

Рис. 8.4. Организация логического сдвига числа вправо на i разрядов (умножение на 2 в степени -i числа в прямом коде)

Если же число задано в дополнительном коде, то его умножение на 2-i (сдвиг вправо на i разрядов) проводится по схеме арифметического сдвига. При этом число сдвигается вправо вместе со своим знаком. Знак остается на месте.

Цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.5).

Организация арифметического сдвига числа вправо на i разрядов (умножение на  2 в степени -i числа  в дополнительном коде)

Рис. 8.5. Организация арифметического сдвига числа вправо на i разрядов (умножение на 2 в степени -i числа в дополнительном коде)

Умножение чисел, заданных в прямом коде

Рассмотрим вариант умножения операндов, представленных в прямом коде. Числа с фиксированной запятой в прямом коде записываются согласно выражению (7.1). Поэтому запишем множимое как Х_{пк} = ЗнХ.\left |X\right |, а множитель как Y_{пк} = ЗнY.\left |Y\right | = ЗнY.(y_12^{-1}+y_22^{-2}+...+ y_n2^{-n}). Тогда произведение нам необходимо получить в виде

Z_{пк} = Х_{пк} \bullet Y_{пк} = ЗнZ.\left |Z\right |,

и действие распадается на два самостоятельных действия: получение знака произведения и получение модуля его числовой части.

Знак произведения определяется обычным образом как сумма по модулю 2 знаков сомножителей:

ЗнZ = ЗнX \oplus ЗнY ( 8.1)

Теперь запишем формулу (точнее, формулы) для вычисления модуля произведения.

\left |Z\right | = \left |X\right | \bullet \left |Y\right | = \left |X\right | \bullet (y_12^{-1}+y_22^{-2}+...+y_n2^{-n})

Преобразуя эту формулу, получим

\left |Z\right | = 0 + y_1\bullet\left |X\right |\bullet 2^{-1} + y_2\bullet \left |X\right | \bullet2^{-2} + ... + y_n \bullet \left |X\right |\bullet 2^{-n} ( 8.2)

которая приводит к алгоритму умножения со старших разрядов множителя, или к формуле

\left |Z\right | = ((...(((0 + y_n \bullet \left |X\right |) \bullet 2^{-1}) +\left |X\right |\bullet y_{n-1}) \bullet2^{-1}) + ...+ \left |X\right |\bullet y_2) \bullet2^{-1} + \left |X\right |\bullet y_1) \bullet2^{-1} ( 8.3)

которая показывает последовательность действий при умножении с младших разрядов множителя.

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

Во-первых, отметим, что мы имеем дело с двоичными числами. В связи с этим, yi может принимать только два разных значения: "ноль" либо "единица". В первом случае величина \left |X\right |\bullet y_i не участвует в формировании частичного произведения на соответствующем шаге умножения, а во втором случае – участвует.

Такой сдвиг реализуется на основе сдвигового регистра (см. "Схемотехническая реализация элементов вычислительной техники" ). При этом разряды, выходящие за пределы разрядной сетки, теряются (но в полноразрядной сетке такого произойти не может).

Пример 8.1.

12_{10} \bullet 2^{-2} =4_{10}
1100_2 \bullet 2^{-2} = 0011_2 = 4_{10}

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

ЭВМ работает с операндами равной длины. Если длины операндов не совпадают, то операнд, имеющий меньшую длину, расширяется знаком до разрядности операнда с большей длиной. Поэтому будем считать, что оба операнда имеют длину в n числовых разрядов. В этом случае мы получим 2n разрядное произведение (не считая одного разряда, отводимого под знак числа).

Получение результата с точностью, превосходящей точность исходных данных, бессмысленно. В литературе показано [...], что в случае n разрядных операндов необходимая точность получается для чисел в формате с фиксированной запятой для результата в укороченной разрядной сетке, содержащей n + d разрядов, где d ≥ log2n.Так, для чисел, имеющих четыре разряда в цифровой части, можно проводить умножение в разрядной сетке 4 + log24 = 6 разрядов. Но, во-первых, это потребует проведения округления на каждом шаге вычисления произведения. А, во-вторых, возникают вопросы: "Что делать с полученным числом, которое имеет длину больше, чем длина операнда, но меньше, чем удвоенная длина операнда? Как его хранить в памяти? Как использовать в последующих операциях?" В силу этого и ряда других моментов укороченная разрядная сетка при выполнении так называемых "длинных" операций (умножения и деления) в универсальных компьютерах не применяется, и мы при рассмотрении примеров выполнения умножения и деления ею пользоваться не будем.

< Лекция 7 || Лекция 8: 123 || Лекция 9 >