умножение в прямом коде
Умножение чисел с фиксированной запятой в прямом и дополнительном кодах
Умножение с младших разрядов множителя чисел, заданных в дополнительном коде
При умножении чисел, заданных в дополнительном коде, с младших разрядов множителя, так же как и при умножении со старших разрядов множителя в формировании произведения участвует все число, включая его знак. Произведение также получается в дополнительном коде со знаком. Соответствующая формула умножения выглядит следующим образом:
( 8.4) |
где y0 – знак множителя;
yn+1 – разряд, дополняющий множитель справа; для дополнительного кода yn+1 ≡ 0 при любом значении знака Yдк.
Так же, как и в предыдущем алгоритме, (yi+1-yi) может принимать три разных значения: (-1), (0), (+1), исходя из чего на каждом шаге вычислений к полученному на предыдущем шаге значению СЧП добавляется Xдк, ноль или (-Xдк) соответственно.
Следует отметить, что, в отличие от аналогичного способа умножения модулей сомножителей в прямом коде, здесь на последнем шаге сдвига вправо нет.
Пример 8.5.
Выполнить умножение с младших разрядов множителя следующих чисел с фиксированной запятой, заданных в дополнительном коде: Xдк = 0.1100; Yдк = 0.0111
Решение.
Пример 8.6.
Перемножим с младших разрядов самые большие (по модулю) числа, которые можно представить в дополнительном коде: Xдк = 0.1111; Yдк = 1.0000.
Решение.
Выполним проверку.
Это соответствует ожидаемому результату.
Выполним проверку.
Это соответствует ожидаемому результату.
Краткие итоги
В данной лекции рассмотрены способы умножения чисел с фиксированной запятой, заданных в прямом и дополнительном кодах. Рассмотрено умножение положительных и отрицательных чисел, заданных в прямом и дополнительном кодах, на 2 ±k как арифметический или логический сдвиг соответствующего числа. Показана связь различных алгоритмов умножения с используемой аппаратурой.
Умножение чисел с фиксированной запятой в прямом и дополнительном кодах
Умножение чисел с фиксированной запятой имеет несколько вариантов, каждый из которых влияет на те или иные характеристики ЭВМ и, соответственно, должен быть принят во внимание при ее проектировании или анализе ее работы.
Умножение чисел c фиксированной запятой на 2 в степени ±k
Умножение двоичных чисел на целую степень числа два, казалось бы, не представляет существенных сложностей. Но при машинном выполнении этого действия необходимо учитывать ряд моментов, среди которых форма представления числа, разрядность используемой машинной сетки, код, в котором записано данное число и некоторые другие.
Данное действие используется как при выполнении операции умножения, так и деления чисел в различных кодах и с использованием разных алгоритмов.
Умножение чисел c фиксированной запятой на 2 в степени +k
Данное действие соответствует увеличению двоичного числа в k раз, что равносильно его сдвигу влево на k разрядов. При этом необходимо учесть следующие моменты:
Для положительных чисел их представление в прямом, обратном и дополнительном кодах совпадают (Рис.8.1).
Поэтому умножение числа на 2 +k для всех кодов происходит аналогичным образом. Очевидно, что для положительного числа данное действие приведет к переполнению (число превысит единицу) лишь при условии k > s.
Освобождающиеся справа разряды заполняются нулями (Рис.8.2):
Для отрицательных чисел умножения на 2 +k зависит от того, в каком коте это число представлено.
Для чисел, записанных в прямом коде, умножение не приведет к переполнению разрядной сетки в случае, если первые s разрядов числа были единицами, и выполнялось условие s > k (Рис.8.3). При этом освобождающиеся справа разряды заполняются нулями.
Для чисел, заданных в прямом коде, выполняется, так называемый, логический сдвиг, при котором знак числа остается на месте, а освобождающиеся за знаком позиции заполняются нулями. При этом цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.4).
Цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.5).
Умножение чисел, заданных в прямом коде
Рассмотрим вариант умножения операндов, представленных в прямом коде. Числа с фиксированной запятой в прямом коде записываются согласно выражению (7.1). Поэтому запишем множимое как , а множитель как
. Тогда произведение нам необходимо получить в виде
и действие распадается на два самостоятельных действия: получение знака произведения и получение модуля его числовой части.
Знак произведения определяется обычным образом как сумма по модулю 2 знаков сомножителей:
( 8.1) |
Теперь запишем формулу (точнее, формулы) для вычисления модуля произведения.
Преобразуя эту формулу, получим
( 8.2) |
которая приводит к алгоритму умножения со старших разрядов множителя, или к формуле
( 8.3) |
которая показывает последовательность действий при умножении с младших разрядов множителя.
Прежде чем подробно рассматривать примеры, иллюстрирующие каждый из этих алгоритмов, остановимся на некоторых общих для обоих алгоритмов моментах.
Во-первых, отметим, что мы имеем дело с двоичными числами. В связи с этим, yi может принимать только два разных значения: «ноль» либо «единица». В первом случае величина не участвует в формировании частичного произведения на соответствующем шаге умножения, а во втором случае – участвует.
Такой сдвиг реализуется на основе сдвигового регистра (см. «Схемотехническая реализация элементов вычислительной техники» ). При этом разряды, выходящие за пределы разрядной сетки, теряются (но в полноразрядной сетке такого произойти не может).
Пример 8.1.
В-третьих, следует сказать о разрядности используемых в операции операндов, произведения и разрядной сетки, в которой необходимо проводить необходимые действия по его получению.
ЭВМ работает с операндами равной длины. Если длины операндов не совпадают, то операнд, имеющий меньшую длину, расширяется знаком до разрядности операнда с большей длиной. Поэтому будем считать, что оба операнда имеют длину в n числовых разрядов. В этом случае мы получим 2n разрядное произведение (не считая одного разряда, отводимого под знак числа).
Получение результата с точностью, превосходящей точность исходных данных, бессмысленно. В литературе показано [. ], что в случае n разрядных операндов необходимая точность получается для чисел в формате с фиксированной запятой для результата в укороченной разрядной сетке, содержащей n + d разрядов, где d ≥ log2n.Так, для чисел, имеющих четыре разряда в цифровой части, можно проводить умножение в разрядной сетке 4 + log24 = 6 разрядов. Но, во-первых, это потребует проведения округления на каждом шаге вычисления произведения. А, во-вторых, возникают вопросы: «Что делать с полученным числом, которое имеет длину больше, чем длина операнда, но меньше, чем удвоенная длина операнда? Как его хранить в памяти? Как использовать в последующих операциях?» В силу этого и ряда других моментов укороченная разрядная сетка при выполнении так называемых «длинных» операций (умножения и деления) в универсальных компьютерах не применяется, и мы при рассмотрении примеров выполнения умножения и деления ею пользоваться не будем.
Умножение чисел с фиксированной запятой в прямом и дополнительном кодах
Умножение чисел с фиксированной запятой имеет несколько вариантов, каждый из которых влияет на те или иные характеристики ЭВМ и, соответственно, должен быть принят во внимание при ее проектировании или анализе ее работы.
Умножение чисел c фиксированной запятой на 2 в степени ±k
Умножение двоичных чисел на целую степень числа два, казалось бы, не представляет существенных сложностей. Но при машинном выполнении этого действия необходимо учитывать ряд моментов, среди которых форма представления числа, разрядность используемой машинной сетки, код, в котором записано данное число и некоторые другие.
Данное действие используется как при выполнении операции умножения, так и деления чисел в различных кодах и с использованием разных алгоритмов.
Умножение чисел c фиксированной запятой на 2 в степени +k
Данное действие соответствует увеличению двоичного числа в k раз, что равносильно его сдвигу влево на k разрядов. При этом необходимо учесть следующие моменты:
Для положительных чисел их представление в прямом, обратном и дополнительном кодах совпадают (Рис.8.1).
Поэтому умножение числа на 2 +k для всех кодов происходит аналогичным образом. Очевидно, что для положительного числа данное действие приведет к переполнению (число превысит единицу) лишь при условии k > s.
Освобождающиеся справа разряды заполняются нулями (Рис.8.2):
Для отрицательных чисел умножения на 2 +k зависит от того, в каком коте это число представлено.
Для чисел, записанных в прямом коде, умножение не приведет к переполнению разрядной сетки в случае, если первые s разрядов числа были единицами, и выполнялось условие s > k (Рис.8.3). При этом освобождающиеся справа разряды заполняются нулями.
Для чисел, заданных в прямом коде, выполняется, так называемый, логический сдвиг, при котором знак числа остается на месте, а освобождающиеся за знаком позиции заполняются нулями. При этом цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.4).
Цифры, выходящие за пределы разрядной сетки, теряются (Рис.8.5).
Умножение чисел, заданных в прямом коде
Рассмотрим вариант умножения операндов, представленных в прямом коде. Числа с фиксированной запятой в прямом коде записываются согласно выражению (7.1). Поэтому запишем множимое как , а множитель как
. Тогда произведение нам необходимо получить в виде
и действие распадается на два самостоятельных действия: получение знака произведения и получение модуля его числовой части.
Знак произведения определяется обычным образом как сумма по модулю 2 знаков сомножителей:
( 8.1) |
Теперь запишем формулу (точнее, формулы) для вычисления модуля произведения.
Преобразуя эту формулу, получим
( 8.2) |
которая приводит к алгоритму умножения со старших разрядов множителя, или к формуле
( 8.3) |
которая показывает последовательность действий при умножении с младших разрядов множителя.
Прежде чем подробно рассматривать примеры, иллюстрирующие каждый из этих алгоритмов, остановимся на некоторых общих для обоих алгоритмов моментах.
Во-первых, отметим, что мы имеем дело с двоичными числами. В связи с этим, yi может принимать только два разных значения: «ноль» либо «единица». В первом случае величина не участвует в формировании частичного произведения на соответствующем шаге умножения, а во втором случае – участвует.
Такой сдвиг реализуется на основе сдвигового регистра (см. «Схемотехническая реализация элементов вычислительной техники» ). При этом разряды, выходящие за пределы разрядной сетки, теряются (но в полноразрядной сетке такого произойти не может).
Пример 8.1.
В-третьих, следует сказать о разрядности используемых в операции операндов, произведения и разрядной сетки, в которой необходимо проводить необходимые действия по его получению.
ЭВМ работает с операндами равной длины. Если длины операндов не совпадают, то операнд, имеющий меньшую длину, расширяется знаком до разрядности операнда с большей длиной. Поэтому будем считать, что оба операнда имеют длину в n числовых разрядов. В этом случае мы получим 2n разрядное произведение (не считая одного разряда, отводимого под знак числа).
Получение результата с точностью, превосходящей точность исходных данных, бессмысленно. В литературе показано [. ], что в случае n разрядных операндов необходимая точность получается для чисел в формате с фиксированной запятой для результата в укороченной разрядной сетке, содержащей n + d разрядов, где d ≥ log2n.Так, для чисел, имеющих четыре разряда в цифровой части, можно проводить умножение в разрядной сетке 4 + log24 = 6 разрядов. Но, во-первых, это потребует проведения округления на каждом шаге вычисления произведения. А, во-вторых, возникают вопросы: «Что делать с полученным числом, которое имеет длину больше, чем длина операнда, но меньше, чем удвоенная длина операнда? Как его хранить в памяти? Как использовать в последующих операциях?» В силу этого и ряда других моментов укороченная разрядная сетка при выполнении так называемых «длинных» операций (умножения и деления) в универсальных компьютерах не применяется, и мы при рассмотрении примеров выполнения умножения и деления ею пользоваться не будем.
Представление целых чисел: прямой код, код со сдвигом, дополнительный код
Выбор способа хранения целых чисел в памяти компьютера — не такая тривиальная задача, как могло бы показаться на первый взгляд. Желательно, чтобы этот способ:
Рассмотрим разные методы представления.
Содержание
Прямой код [ править ]
Достоинства представления чисел с помощью прямого кода [ править ]
Недостатки представления чисел с помощью прямого кода [ править ]
Из-за весьма существенных недостатков прямой код используется очень редко.
Код со сдвигом [ править ]
По сути, при таком кодировании:
Достоинства представления чисел с помощью кода со сдвигом [ править ]
Недостатки представления чисел с помощью кода со сдвигом [ править ]
Из-за необходимости усложнять арифметические операции код со сдвигом для представления целых чисел используется не часто, но зато применяется для хранения порядка вещественного числа.
Дополнительный код (дополнение до единицы) [ править ]
В качестве альтернативы представления целых чисел может использоваться код с дополнением до единицы (англ. Ones’ complement).
Алгоритм получения кода числа:
Достоинства представления чисел с помощью кода с дополнением до единицы [ править ]
Недостатки представления чисел с помощью кода с дополнением до единицы [ править ]
Дополнительный код (дополнение до двух) [ править ]
Чаще всего для представления отрицательных чисел используется код с дополнением до двух (англ. Two’s complement).
Алгоритм получения дополнительного кода числа:
Длинная арифметика для чисел, представленных с помощью кода с дополнением до двух [ править ]
Достоинства представления чисел с помощью кода с дополнением до двух [ править ]
Недостатки представления чисел с помощью кода с дополнением до двух [ править ]
Несмотря на недостатки, дополнение до двух в современных вычислительных системах используется чаще всего.
Умножение чисел с фиксированной запятой в прямом и дополнительном кодах
Умножение со старших разрядов множителя чисел, заданных в прямом коде
Напомним, что при реальной записи числа в памяти ЭВМ какие-либо символы, отделяющие знак от цифровой части числа, отсутствуют. Так что в данном случае мы имеем дела с пятиразрядным числом, включающим знак и четыре цифровых разряда.
Так как в прямом коде знак произведения и его модуль формируются отдельно, то следует обсудить лишь вопросы, касающиеся количества разрядов, отводимых под хранение мантисс сомножителей и мантиссы произведения.
Мы уже отмечали, что произведение следует получать в 2n-разрядной сетке, где n – количество разрядов у операндов.
Умножение со старших разрядов множителя заключается в том, что за время умножения на один разряд множителя происходит два действия:
В силу того, что в операции должны участвовать операнды одинаковой разрядности, а разрядность результата, равна 2n, то и изначально должен храниться в регистре длиной 2n, в котором младшие n позиций заполнены нулями. Также изначальное значение СЧП тоже должно быть равно нулю и изначально все ее позиции должны быть заполнены нулями. Для СЧП может быть выбран обычный регистр хранения: исходя из формулы (8.2) его значение сдвигам не подвергается.
Регистр, хранящий , в процессе выполнения умножения интересен не как единое целое, а как набор отдельных разрядов, хранящих значения yi, использующихся при формировании очередного СЧП. Получение очередного значения yi в следующем такте формирования СЧП может быть выполнено разнообразными схемотехничекими решениями, наиболее рациональным из которых представляется хранение
в n-разрядном регистре сдвига, его сдвиге в сторону старших разрядов после анализа очередного разряда и снятии старшего разряда этого регистра в каждом такте для анализа очередного разряда yi.
Таким образом, мы получаем следующие схемотехнические требования к регистрам, которые хранят модули операндов и результата:
Пример 8.2.
Умножить два числа с фиксированной запятой, заданных в прямом коде, со старших разрядов множителя: Xпк = 1.0110, Yпк = 0.1010.
Исходя из вышесказанного, выполнение данного примера будет складываться из следующих этапов.
Так как в формировании произведения участвует , сдвинутый на соответствующее число разрядов вправо, то для наглядности будем представлять его в виде отдельного столбца значений.
На основе данного примера рассмотрим еще один момент, отражающий связь между используемым при выполнении арифметических действий алгоритмом и особенностями организации ЭВМ. При умножении со старших разрядов множителя чисел, заданных в прямом коде, к значению СЧП, полученному на очередном шаге, в зависимости от значения очередного разряда yi добавляется либо , сдвинутый на соответствующее количество разрядов вправо, либо ноль. Добавления ноля, казалось бы, только замедляет выполнение операции (в половине случаев такое сложение бессмысленно). Однако, и тот, и другой вариант действий может быть использован. Первый вариант носит название варианта без пропуска такта суммирования, а второй, соответственно, с пропуском такта суммирования.
В качестве преимущества первого варианта мы отметили устранение операции суммирования с нулем, которое не приводит к изменению предыдущего значения СЧП. Но при этом у нас изменяется регулярность последовательности тактов выполнения операции умножения, а само значение yi должно быть передано и проанализировано устройством управления компьютера, которое является сложной и нерегулярной схемой. В то же время прибавление нуля к СЧП (при yi = 0) можно осуществить достаточно просто. Фрагмент такого действия показан на Рис. 8.6. Более подробно арифметико-логическое устройство, реализующее такой алгоритм умножения, показано в [ ].
Умножения с младших разрядов множителя чисел, заданных в прямом коде
Данное умножение реализуется согласно формуле (8.3). Суть этой формулы проста: к СЧП, полученной на предыдущем шаге добавляется , умноженный на значение соответствующего разряда yi, а затем полученное новое значение сдвигается вправо на 1 разряд. Нюанс этого алгоритма как раз и заключается в этом сдвиге, завершающем формирование очередного значения СЧП.
Пример 8.3.
Выполнить умножение с младших разрядов множителя следующих чисел с фиксированной запятой, заданных в прямом коде: