
- •Арифметические операции
- •Операция изменения знака
- •Сложение и вычитание чисел без знака
- •Сложение
- •Вычитание
- •Операция алгебраического умножения
- •Операция алгебраического деления
- •Операция округления действительных чисел
- •Арифметические действия в ддк Сложение в двоично-десятичном коде
- •Вычитание в двоично-десятичном коде
- •Алгебраическое сложение в ддк с использованием дополнительного кода
- •Модифицированные коды
- •Арифметика повышенной точности
Операция алгебраического деления
В отличие от умножения, сложения и вычитания результат операции деления в общем случае не может быть представлен точно в формате конечной длины. Поэтому различают:
• деление целых с вычислением целого частного и/или остатка;
• деление целых и действительных чисел с вычислением частного в заданном формате с фиксированной точкой;
• деление целых и действительных чисел с вычислением заданного количества значащих разрядов частного;
• деление целых и действительных чисел с вычислением заданного количества значащих разрядов частного с округлением результата.
Знак частного равен сумме по модулю 2 знаковых разрядов операндов.
Операнды могут быть числами со знаком или без знака. При делении целых без знака принимают, что знак операндов положителен, а знаки частного и остатка отбрасывают.
Особые случаи. При делении возникают особые случаи, когда оба или один из операндов равны нулю. Пусть X – делимое, Y – делитель, Z – частное, R – остаток.
1. X=0; Y≠0. Результат Z=0 и R=0. Вопрос состоит в знаках результата
2. X ≠0; Y=0. Частное Z=∞ и не является конкретной числовой величиной. Открыт вопрос об остатке R и о знаках частного и остатка.
3. X=0; Y=0. Частное Z и остаток R не являются числовыми величинами.
Поэтому при делении обязательно проверяют операнды на нуль. При обнаружении особого случая процесс деления прерывают и формируют признак особого случая. Принимают решение о том, что делать дальше. Обычно частному и остатку присваивают нулевые значения. Знак частного определяют как сумму по модулю 2 знаковых разрядов операндов, а знак остатка принимают равным знаку делимого. В случаях 2 и 3 процесс вычислений прерывают.
Рассмотрим результаты различных операций деления при отсутствии особых случаев.
Деление целых с вычислением целого частного Z и целого остатка R
При любом способе деления целых с вычислением целого частного и остатка в любой системе счисления результаты должны быть точными и удовлетворять отношению:
причем
Формат частного должен быть равен формату делимого, так как при Y = 1, частное Z = X.
Формат остатка должен быть равен формату делителя, так как модуль остатка может быть меньше модуля делителя всего лишь на 1.
Знак остатка совпадает со знаком делимого. Действительно, из (1) следует, что при X<0, произведение YZ<0. Поэтому для вычисления делимого по (1) нужно к отрицательной величине YZ прибавлять отрицательный остаток.
Например, 16:3=+5 и R=+1; 16:(–3)=–5 и R=+1; (–16):3=–5 и R=–1; (–16):(–3)=+5 и R=–1.
Деление целых и действительных чисел с вычислением частного в формате с фиксированной точкой
Частное Z вычисляют с абсолютной погрешностью Δ=X/Y–Z, величина которой неизвестна, а ее значение принадлежит некоторому заданному интервалу [Δмакс, Δмин], причем знак Δ может любым, если Δмакс≥0, а Δмин<0. Так, что
Формат частного выбирают исходя из границ интервалов, которым могут принадлежать абсолютные значения операндов. Очевидно, что формат частного должен позволять сохранять значение старшего значащего разряда частного.
Так как
то, зная |X|макс и |Y|мин, не трудно найти вес старшего значащего разряда в формате Z.
Количество значащих разрядов в формате выбирают исходя из заданной точности представления и выбранного способа округления Z.
Деление целых и действительных чисел с вычислением заданного количества значащих разрядов частного
Результатами являются точные значения заданного количества l старших значащих разрядов частного, начиная с первого разряда слева не равного нулю, и индекс i младшего значащего разряда. Например, при l=5 результат деления 15,3:(–17,1)=–0,89473684… должен быть (Z=–89473; i=–5).
В особом случае при X=0 и Y≠0 следует всем значащим разрядам частного присвоить значение 0, принять i=0 и сформировать признак особого случая.
Формат частного включает разряд знака и l значащих разрядов. Формат i целого со знаком выбирают исходя из значений индекса младшего разряда минимально возможного значения частного при заданных форматах операндов и значения l.
Так как младшие разряды частного отбрасываются (их количество в общем случае бесконечно велико), то образуется ошибка в его представлении. Абсолютная погрешность частного Δ=X/Y–Z при таком его вычислении в точности равна количественному эквиваленту не вычисленных младших разрядов или, это то же самое, количественному эквиваленту R/Y
где R – последний остаток от деления.
Справедливы отношения:
Знак абсолютной погрешности Δ не является случайным, а совпадает со знаком частного, так как знак R совпадает со знаком делимого.
Модуль абсолютной погрешности частного случаен и его величина
где P – основание системы счисления;
i≠const – индекс младшего разряда частного, который определяется вычисляемым в процессе деления положением запятой в частном.
Максимальное значение модуля погрешности можно принять
Относительная погрешность, приведенная к величине частного
всегда положительна, так как знак погрешности Δ совпадает со знаком частного.
Максимальное значение относительной погрешности зависит только от основания системы счисления и от количества вычисляемых разрядов в частном
так как |Z|мин содержит только одну 1 в старшем значащем разряде с индексом i+l–1.
Деление целых и действительных чисел с вычислением заданного количества значащих разрядов частного с округлением результата
Отличается от предыдущего случая тем, что с целью уменьшения погрешности результат округляется до ближайшего к точному значению частного.
Рассмотрим некоторые способы вычисления разрядов частного и остатка.
Деление действительных чисел можно свести к делению целых. Для этого следует в дробных частях операндов уровнять количество разрядов, приписав, справа к одному из них недостающие нули, и интерпретировать полученные коды как целые. Например, 53,253:2,4=53,253:2,400= =53 253:2 400. Поэтому в дальнейшем будем рассматривать способы деления целых.
Деление прямых двоичных кодов операндов с вычислением прямых кодов частного и остатка
Знаки частного и остатка определяют по приведенным выше правилам и сводят деление к вычислению значащих разрядов частного и остатка по значащим разрядам операндов.
В основу способов деления могут быть положены следующие результаты.
Пусть делимое X>0 и делитель Y>0 двоичные n разрядные целые. Справедливо отношение
где Z – частное, индекс старшего значащего разряда которого не может превышать n–1;
Rm – остаток от деления X на Y;
m – индекс младшего разряда частного (m ≤ n–1).
Остаток должен удовлетворять условию 2m(Y–1) ≥ Rm ≥ 0.
Поскольку частное
где zi – цифры частного Z и zi∈{0,1}, то
Из (1) следует
где Ri – промежуточный остаток (i=n–1, n–2, … , m), причем 2i(Y–1) ≥ Ri ≥ 0.
Из (2) получим
Так как члены выражения (4) не меньше нуля и zi∈{0,1}, то из (4) следуют правила для вычисления остатков и значений разрядов частного, начиная со старшего разряда zn-1:
На основании полученных правил могут быть разработаны различные способы их реализации.
Деление чисел с просмотром разрядов делимого слева направо
Пусть делимое X>0 и делитель Y>0 двоичные целые без знака в форматах включающих n и k разрядов соответственно. Индекс старшего значащего разряда частного должен совпадать с индексом старшего разряда делимого и быть равным n–1. Индекс младшего разряда частного m определяется требуемым числом разрядов в частном и может быть m≤n.
Разряды частного, начиная с zn–1 до zm включительно, вычисляют, придерживаясь выражений (5) – (7), но для упрощения и/или ускорения вычислений вводят различные модификации не влияющие на результат.
Деление с записью очередного сдвинутого влево остатка на место предыдущего и вычислением разряда частного в соответствии с (7)
Рассмотрим способ деления на примере.
Пусть X=110112=2710; Y=1012=510. Количество разрядов в делимом n=5; в делителе – k=3. Индексы старших разрядов частного и делимого равны n–1=4, так как при Y=1 Z=X. Вычислим разряды частного от z4 до z–3. Тогда m=–3; i =4,3, ... ,–3.
Из (7) следует, что о значении разряда zi (i=n–1, n–2, … ,m) можно судить, сравнивая предыдущий остаток Ri+1 с делителем, сдвинутым при i >0 на i разрядов влево, а при i<0 на |i| разрядов вправо. При i=n–1 остаток Ri+1=Rn=X, а делитель сдвинут на n–1 разрядов влево так, что младший значащий разряд делителя совмещен со старшим разрядом делимого в одной позиции.
Из (8) следует, что при zi=0 очередной остаток Ri равен предыдущему, а при zi=1 очередной остаток равен Ri+1–2iY.
Исходя из сказанного, выполним следующие действия.
Расширим формат делимого, приписав к нему слева k нулей.
Разобьем формат расширенного делимого на две группы разрядов, старшую и младшую. К старшей группе (обозначим ее X1) отнесем k+1 разрядов.
Деление будем выполнять по шагам.
1. Сравнивать количественные эквиваленты X1 и Y, вычисляя значение отношения X1≥Y. Сравниваются (k+1)-разрядный код X1 с k-разрядным кодом Y.
2. Вычислять значение разности X1–Y.
В каждом шаге результат сравнения является очередной цифрой частного, начиная со старшей.
Результат вычисления разности X1–Y служит для определения очередного остатка и используется только в том случае, когда отношение (X1≥Y)=1, т.е. при X1–Y≥0. Поэтому можно разрешить: выполнять вычитание с ошибкой при X1<Y; вычислять только k младших разрядов разности X1–Y. Это позволит упростить и ускорить выполнение операции вычитания.
В шаге образуем новое делимое по следующему правилу. Если цифра частного 0, сдвинем делимое влево на один разряд с занесением нуля справа и потерей старшего разряда. Сдвиг сводится к чтению делимого и последующей записи его значения на прежнее место со смещением влево. Если цифра частного 1, выполним ту же работу, но при записи подменим старшие k разряды вычисленной разностью.
Действительно. При zi=0 очередной остаток Ri равен предыдущему (7). Из (5) – (7) следует, что в очередном шаге следует повторить вычисления, сдвинув делитель на один разряд вправо по отношению к его положению в предыдущем шаге или, это то же самое, сдвинув делимое на разряд влево. При zi=1 младшие разряды очередного остатка совпадают с младшими разрядами предыдущего остатка не участвовавшими в вычислениях, а старшие равны вычисленной разности. Поэтому при zi=1 для получения очередного делимого нужно сдвинуть старое делимое на разряд влево с одновременной заменой старших разрядов вычисленной разностью. Поскольку при сдвиге старший разряд разности будет потерян, то нет смысла его вычислять, что учтено при вычислении X1–Y.
В аппаратуре можно новое делимое записывать на место старого. Это позволяет использовать в очередном шаге оборудование, использовавшееся для сравнения и вычисления нового делимого в предыдущем шаге.
В примере в первом шаге вычисляем (X1≥Y)=0 – старшую цифру частного. Одновременно с записью цифры частного 0, сдвинем делимое влево. Получим новое делимое X=00110110 и X1=0011. Во втором шаге результат сравнения 0. Очередное делимое X=01101100 и X1=0110. В третьем шаге цифра частного 1, так как (X1≥Y)=1. Разность X1–Y=001. Заменив, старшие три разряда в сдвигаемом делимом на разность получим очередное делимое 00111000.
Процесс деления может продолжаться до бесконечности. Для прекращения процесса используют следующие правила:
− При делении целых с вычислением целого частного и остатка выполняют n шагов. Искомый остаток имеет формат делителя и размещен в старших разрядах делимого вычисленного в последнем шаге. В примере он выделен жирным шрифтом и равен 010.
− При делении целых и действительных чисел с вычислением частного в заданном формате с фиксированной точкой шаги выполняют до заполнения всех разрядов формата частного.
− При делении целых и действительных чисел с вычислением заданного количества значащих разрядов частного выполняют отсчет числа выполненных шагов, начиная с шага результатом которого является первая единица в частном, и продолжают выполнять шаги до тех пор, пока количество отсчитанных шагов не станет равным заданному количеству значащих разрядов.
Операцию вычитания можно заменить сложением X1 с дополнением Y. Например, в примере дополнение 101 будет равно 011. Значения суммы будут использоваться только при (X1≥Y)=1 и только k ее младших разрядов, что позволит упростить выполнение операции сложения.
Деление в дополнительных кодах с получением частного в дополнительном коде
Если операнды представлены в дополнительном коде, можно преобразовать их в прямой код, затем выполнить деление в прямом коде и, если частное должно быть представлено в дополнительном коде, преобразовать прямой код частного в дополнительный. Процедуры преобразования кодов замедляют процесс деления. Поэтому применяют способы деления без промежуточного преобразования операндов в прямой код.
При конструировании способов деления в дополнительных кодах можно в их основу положить рассмотренные способы деления в прямых кодах. Очевидно, что знак дополнительного кода частного можно вычислять так же как в прямом коде сложением по модулю 2 знаковых разрядов операндов. Следовательно, задача сводится к поиску способа деления значащих разрядов операндов представленных в дополнительном коде.
При расширении формата делимого влево следует копировать в дополнительные разряды знаковый разряд делимого, чтобы не изменить его количественный эквивалент. Например, делимое x=1|00101=–27. После расширения формата делимого на два разряда влево x=1|1100101=–27.
Сконструируем способ деления в дополнительных кодах, положив в его основу способ деления в прямых кодах использованный в предыдущем примере, допуская его модификацию. Заметим, что многие из рассматриваемых в конструируемом способе решений могут быть применены при конструировании иных способов деления в дополнительном коде.
При делении в прямых кодах для нахождения очередной цифры частного определяли: укладывается ли делитель в коде X1 старших разрядов делимого, относя к ним столько разрядов делимого, какова длина делителя. При делении в дополнительном коде можно поступать аналогично. Остается лишь открытым вопрос о том, как выполнять сравнение модулей чисел со знаком, если они представлены в дополнительном коде.
Если знаки операндов совпадают, то судить о том, укладывается ли в X1 делитель можно по знаку их разности. Например, +7–(+5)=+2 (укладывается); –7–(–5)=–2 (укладывается). Если знаки операндов не совпадают, то соответствующим признаком является знак суммы. Например, +7+(–5)=+2 (укладывается); –7+(+5)=–2 (укладывается).
Следовательно, если знаки операндов совпадают, для сравнения следует вычислять разность X1–Y; если знаки операндов не совпадают, следует выполнять сложение X1+Y. Признаком укладывания в обоих случаях является совпадение знака результата сложения или вычитания со знаком делимого.
Заметим, что можно предложить иные способы сравнения.
Из приведенных примеров сравнения видно, что признаком 1 в прямом коде частного будет совпадение знака делимого со знаком разности или суммы. Для получения обратного кода частного можно использовать признак совпадения знака делителя со знаком разности (суммы) как признак 1 в разряде частного. Дополнительный код частного можно получить преобразованием его обратного кода в дополнительный.
Если делитель не укладывается в X1, для получения очередного значения X1 следует сдвинуть делимое на один разряд влево с потерей разряда слева и занесением нуля справа (удвоить). В противном случае, нужно при сдвиге делимого на разряд влево заместить его старшие разряды вычисленной разностью (суммой). Рассмотрим применение этого правила на примере.