
- •Арифметические операции
- •Операция изменения знака
- •Сложение и вычитание чисел без знака
- •Сложение
- •Вычитание
- •Операция алгебраического умножения
- •Операция алгебраического деления
- •Операция округления действительных чисел
- •Арифметические действия в ддк Сложение в двоично-десятичном коде
- •Вычитание в двоично-десятичном коде
- •Алгебраическое сложение в ддк с использованием дополнительного кода
- •Модифицированные коды
- •Арифметика повышенной точности
Вычитание
Вычитание в дополнительном коде сводится к вычитанию одноименных разрядов чисел, начиная с младшего разряда и включая знаковый разряд, с учетом заёма из предыдущего разряда. Знаковые разряды вычитаются по правилам вычитания двоичных цифр с учетом заёма из предшествующего разряда. Заём из знакового разряда отбрасывается. Полученный результат представлен в дополнительном коде.
Примеры вычитания двоичных чисел в дополнительном коде:
Примеры вычитания шестнадцатеричных чисел в дополнительном коде:
Вычитание в обратном коде отличается от вычитания в дополнительном коде тем, что заём из знакового разряда не отбрасывается, а вычитается из младшего разряда промежуточной разности. Этот заём называют циклическим. Результат вычитания будет получен в обратном коде. Вычитание можно выполнять, начиная с любого разряда.
Примеры вычитания двоичных чисел в обратном коде:
Переполнение разрядной сетки при вычитании
Переполнение разрядной сетки при вычитании может произойти только при разных знаках операндов. Если знак уменьшаемого 0, а вычитаемого 1, то знак разности должен быть 0. При переполнении разрядной сетки знак разности будет 1 из-за отсутствия заёма.
Поэтому признак переполнения можно описать выражениями:
где dn – знаковый разряд разности; un – заём из знакового разряда.
Если знак уменьшаемого 1, а вычитаемого 0, то знак разности должен быть 1. В этом случае признак переполнения описывается выражениями:
Признак переполнения при вычитании описывается уравнениями:
При R=1 дополнительный код правильного значения разности можно получить, приписав к результату слева знак уменьшаемого и считать, что все остальные разряды являются значащими. Например:
Замена операции вычитания сложением и наоборот
Можно вычислить разность Z=X–Y не путем вычитания Y из значения X, а посредством сложения X с (–Y). Действительно:
Это позволяет строить устройство для вычитания (вычитатель) из устройства изменения знака и сумматора.
Напротив, можно исключить выполнение операции сложения, заменив ее операциями изменения знака второго операнда с последующим вычитанием его из первого операнда. Действительно:
Эта возможность никак не зависит от системы счисления и от того, в каких кодах выполняется сложение или вычитание.
Операция алгебраического умножения
Умножение в прямом коде
Результат умножения в прямом коде двух операндов без знака содержащих n и m значащих разрядов имеет n+m значащих разрядов. В частном случае, если n=m разрядность результата вдвое превышает разрядность операндов.
При умножении операндов со знаком и n значащими разрядами образуется произведение, содержащее 2n+1 разряд. Поэтому при записи произведения в формате, вдвое превышающем формат операндов, существует слева один избыточный значащий разряд, в который следует записывать 0. Например, если операнды со знаком представлены в прямом коде в шестнадцатиразрядном формате, то значащих разрядов 15, а разрядность произведения, включая его знак, 2×15+1=31. Поэтому в 32 разрядный формат придется записывать 0 в разряд, следующий за разрядом знака.
Знак произведения вычисляют путем сложения по модулю 2 знаковых разрядов операндов. Значащие разряды произведения вычисляют, перемножая операнды как числа без знака. Результат умножения XY целых без знака должен быть равен результату Y-кратного сложения X с самим собой. Дробные числа перемножают как целые, а положение запятой в произведении определяют, отсчитывая, справа налево столько разрядов, сколько дробных разрядов в операндах вместе.
При умножении вычисляют частные произведения множимого X на каждый разряд множителя Y. Суммируют частные произведения с учетом веса каждого из них равного весу разряда множителя. Вес частного произведения учитывают сдвигом его влево на необходимое число разрядов относительно частного произведения X на младший разряд Y.
При вычислении частных произведений в системе счисления с основанием P>2 необходимо учитывать переносы в старшие разряды, возникающие при умножении цифры X на цифру Y. В двоичной системе такие переносы отсутствуют, что существенно упрощает процесс умножения в двоичной системе счисления.
Таблицы умножения цифр системы счисления можно получить, перемножив количественные эквиваленты ее цифр и представив результаты в этой системе счисления. Например, произведение цифр 9×F шестнадцатеричной системы счисления имеет количественный эквивалент 910×1510=13510, или 8716. Следовательно, результат в данном разряде равен 716, и перенос в следующий разряд равен 816.
В двоичной системе счисления частное произведение X на цифру Y равно 0, если цифра Y равна 0, или оно равно X, если цифра Y равна 1. Это существенно упрощает вычисление частных произведений в двоичной системе.
Например, пусть необходимо перемножить прямые двоичные коды чисел 0⎢1101.01 и 1⎢1011.10. Определим знак результата: 0⊕1=1 – знак произведения минус. Найдем матрицу частных произведений значащих разрядов:
первая и предпоследняя строки матрицы нулевые, так как они содержат частные произведения X на младший и предпоследний разряды Y равные нулю. Остальные строки содержат X, так как соответствующие им разряды Y содержат 1. Каждое последующее частное произведение сдвинуто на разряд влево относительно предыдущего, чтобы учесть его вес;
произведение можно вычислять путем суммирования частных произведений так, как это обычно делают в десятичной системе счисления. Причем порядок суммирования цифр столбца и переносов в столбец не играет роли.
Умножение в дополнительном коде.
Если операнды представлены в дополнительном коде и содержат по n значащих разрядов, то количество значащих разрядов в их произведении равно 2n+1. Это на один разряд больше, чем при умножении в прямом коде. Поэтому, например, при умножении двоичных дополнительных кодов операндов представленных в 16 разрядном формате необходимо для хранения произведения использовать все разряды 32 разрядного формата.
Старший дополнительный значащий 2n+1 разряд дополнительного кода положительного произведения принимает значение 1 только в том случае, когда оба операнда отрицательны и все их значащие разряды равны 0. Это вызвано асимметрией представления чисел в дополнительном коде. Дополнительный значащий 2n+1 разряд отрицательного произведения всегда содержит цифру обратную нулю: 1 в двоичной, 9 в десятичной, F в шестнадцатеричной системах счисления.
Например. Пусть в десятичной системе счисления X=Y=1|00доп (–10010). Тогда произведение XY = 0|10000 (+1000010) и содержит 5, а не 4, как можно было бы ожидать, значащих разрядов.
Знак произведения равен сумме по модулю 2 знаковых разрядов операндов.
Таким образом, по крайней мере, два разряда произведения – знаковый и дополнительный можно вычислять, не выполняя собственно умножения.
Остальные разряды дополнительного кода произведения можно вычислять разными способами. Рассмотрим некоторые из них.
Умножение в дополнительном коде выполняется с промежуточным преобразованием операндов в прямой код и результата – в дополнительный. Очевидно, что изложенный способ умножения дополнительных кодов операндов значительно сложнее способа умножения в прямом коде, что усложняет аппаратуру и замедляет процесс вычислений.
Умножение без преобразования в прямой код с введением корректирующих поправок в результат
Если перемножать значащие разряды дополнительных кодов операндов так, как это делали в прямом коде, то результат получится верным, если знаки операндов положительные. Это следует из того, что дополнительные коды положительных операндов и положительного результата совпадают с их прямыми кодами. При отрицательных знаках операндов результат умножения ошибочен.
Выполним анализ ошибки. Найдем значение результата умножения отрицательных чисел и сравним его с правильным значением.
Пусть операнды X<0, а Y≥0. Так как операнды представлены в дополнительном коде, то количественные эквиваленты значащих разрядов их кодов будут равны Pn−|X| и |Y|. Здесь Pn – вес знакового разряда (n≥0), а Pn−|X| – дополнение значения |X| до Pn. Количественный эквивалент кода значащих разрядов произведения, полученного по правилу умножения в прямом коде, будет равен
Так как правильное значение результата должно быть представлено в дополнительном коде, то его значащие разряды должны содержать код дополнения |XY| до веса знакового разряда произведения. Знаковый разряд произведения должен иметь вес P2n+1, так как количество разрядов в целой части произведения при умножении удваивается и образуется один дополнительный значащий разряд. Следовательно, количественный эквивалент значащих разрядов дополнительного кода произведения должен быть равен
Очевидно, что код результата содержит ошибку, и ее количественный эквивалент
Аналогично, при X≥0 и Y<0 код результата содержит ошибку
Если оба операнда отрицательны X<0, Y<0, то количественный эквивалент кода значащих разрядов произведения получится равным
Так как произведение положительно, правильный код значащих разрядов произведения должен иметь количественный эквивалент |X||Y|.
Ошибка составит величину
Что следует сделать для ликвидации ошибок?
Очевиден первый вариант ответа на этот вопрос – устранять последствия неправильных действий – устранять ошибку путем ее компенсации. В данном случае этот путь поиска вполне реален, так как ошибка детерминирована. Ее можно устранять путем прибавления той или иной корректирующей поправки к результату умножения. Величина корректирующей поправки зависит от знаков операндов.
При несовпадении знаков операндов достаточно прибавить к коду результата умножения сдвинутый влево на n разрядов код дополнения положительного операнда до Pn+1 для того, чтобы количественный эквивалент (1) кода результата умножения стал равным количественному эквиваленту правильного результата (2). Действительно, если, например X<0, а Y≥0, то ошибочный результат (1) увеличенный на (3) будет равен
что и требуется.
Если знаки обоих операндов отрицательны, то к результату умножения достаточно прибавить сдвинутые на n разрядов влево значащие разряды прямых кодов операндов и уменьшить результат на единицу в разряде 2n. Это приведет к тому, что количественный эквивалент результата станет равным требуемому. Действительно, прибавив к ошибочному произведению (4) ошибку (5) получим:
Пример. Пусть десятичные операнды X=±910,24; Y=±800,13. Правильные значения произведений XY=±728310,3312. Дополнительные коды операндов 0⎢910.24; 1⎢089.76 и 0⎢800.13; 1⎢199.87 соответственно. Дополнительные коды произведений 0⎢0728310,3312 и 1⎢9271689.6688.
Перемножим дополнительные коды операндов по правилу умножения в прямых кодах и введем корректирующие поправки.
В исходных данных отсутствуют значения поправок. Поэтому их приходится вычислять путем взятия дополнений операндов, что сильно осложняет процесс умножения.