учебники, программирование, основы, введение в,

 

Деление


Реализация операции деления в ЭВМ в двоичной системе счисления выполняется проще, чем в десятичной. Это объясняется тем, что при определении каждой цифры частного нужно сделать только одну пробу.
Если числа X и Y заданы в прямом коде, и они представлены с фиксированной запятой, то для выполнения деления используются два основных алгоритма:

  • со сдвигом и автоматическим восстановлением остатка;
  • со сдвигом делителя и автоматическим восстановлением остатка.

Пусть: [X]пк = sign X. x1x2..xn
[Y]пк = sign Y. y1y2..yn
[Z]пк = [X]пк/[Y]пк = sign Z. z1z2..zn
X и Y должны быть такими, чтобы:
|Z| < 1 (то есть фиксированная запятая)
Деление в прямом коде со сдвигом и автоматическим восстановлением остатка

  1. sign Z = sign X sign Y
  2. |X| - |Y| = 0
  3. Если 0 0, то z0 = 1 и 20 - |Y| = 1 (z0 – целая часть результата).

Если 0 < 0, то z0 = 0 и 20 + |Y| = 1
и т. д.
Пример:
[X]пк = 0.100
[Y]пк = 1.110
sign Z = 1  0 = 1
[-|Y|]дк = 1.010
+0.100 = [|X|]дк
1.010 = [-|Y|]дк
1.110 = 0 = [|X|]дк + [-|Y|]дк < 0, z0 = 0
+1.100 = 20 (сдвиг в ДК отрицательного числа)
0.110 = [|Y|]дк
0.010 = 1 = 20 + [|Y|]дк > 0, z1 = 1
+0.100 = 21
1.010 = [-|Y|]дк
1.110 = 2 = 21 + [-|Y|]дк < 0, z2 = 0
+1.100 = 22 (сдвиг в ДК отрицательного числа)
0.110 = [|Y|]дк
0.010 = 3 = 22 + [|Y|]дк > 0, z3 = 1
Ответ: [Z]пк = 1.101
Деление в прямом коде со сдвигом делителя и автоматическим восстановлением остатка

  • sign Z = sign X sign Y
  • |X| - |Y| = 0
  • Если 0 0, то z0 = 1.

Если0 < 0, то z0 = 0.

Разрядная сетка (n + d) разрядов, где d = log2n
Пример:
1) [X]пк = 1.1001
2) [Y]пк = 1.1011
n = 4, d = 2

Ответ: [Z]пк = 0.1100


Пример:
[X]пк = 0.100
[Y]пк = 1.110
sign Z = 0  1 = 1
[-|Y|]мдк= 11.010
|Y| = 00.110

Ответ: [Z]пк = 1.101
Деление в дополнительном (обратном) кодах со сдвигом и автоматическим восстановлением остатка
[X]дк,ок; [Y]дк,ок
Деление в ОК не применяется, так как "0" в ОК имеет двойное изображение. В первом такте вместо sign i-1 берётся sign X, а вместо 2i-1 берётся [X]дк,ок
Пример:
[X]дк = 1.0111
[Y]дк = 1.0011
Т.к. sign X = sign Y,то
+1.0111 | 1.0011
0.1101 = -[Y]дк
______
0.0100 = 0 = [X]дк + [-[Y]дк ]дк , sign 0 sign Y, то z0 = 0
20 = +0.1000
Т.к. sign 0 sign Y, то
1.0011 = [Y]дк
______
1.1011 = 1 = 20 + [Y]дк , т.к. sign 1 = sign Y, то z1 = 1
21 = +1.0110
Т.к. sign 1 = sign Y, то
0.1101 = +[-[Y]дк ]дк
______
0.0011 = 2 = 2 1 + [-[Y]дк ]дк , т.к. sign 2 sign Y, то z2 =0
22 = +0.0110
Т.к. sign 2 sign Y, то
1.0011 = [Y]дк
______
1.1001 = 3 = 2 3 + [Y]дк , т.к. sign 3 = sign y, то z3 = 1
23 = +1.0010
Т.к. sign 3 = signY, то
0.1101 = +[-[Y]дк ]дк
______
1.1111 = 4 = 2 3 + [-[Y]дк ]дк , т.к. sign 4 = sign Y, то z4 = 1
Ответ: [Z]дк = 0.1011
Это справедливо при 1 [Z]дк = [X]дк / [Y]дк ]| < 1.
Если необходимо определить частное |[Z]дк = [X]дк / [Y]дк | | < 2, то поступают так:
[X]дк*2-1 / [Y]дк = z0z1z2...zn, z0 – знак, z1 – целая часть числа.

Арифметические операции над числами, представленными с плавающей запятой
В основе арифметических операций над числами с плавающей запятой лежат принципы, на которых базируются операции над числами с фиксированной запятой. При этом есть и некоторые особенности.
Будем условно считать, что порядки заданы в обратном коде, а мантиссы – в прямом.
Умножение:
X = 2mx * sign X.x1x2...xn
Y = 2my * sign Y.y1y2...yn
Z = X*Y = 2mx+my * sign Z.z1z2...zn
Порядок выполнения операции следующий:

  1. Знак произведения находится так же, как и при умножении чисел с фиксированной запятой:
  1. Порядок произведения находится алгебраическим суммированием порядков мно­жимого и множителя.
  1. Мантисса находится по правилам умножения чисел с фиксированной запятой.

При этом возможны следующие случаи:

    1. Мантисса произведения – ненормализованное число, так как
½  |Mx| < 1,
½  |My| < 1, то 
¼  |Mx*My| < 1, при ¼  |Mx*My| < ½ 
имеем ненормализованное число.

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

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

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

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

Деление
В основном аналогично умножению:
X = 2mx * sign X.x1x2...xn
Y = 2my * sign Y.y1y2...yn
Z = X/Y = 2mx–my * sign Z.z1z2...zn
Порядок выполнения операции следующий:

  1. Находится по известным правилам знак частного.
  2. Порядок частного находится как разность порядков делимого и делителя.
  1. Цифры частного находятся так:

вначале находится целая часть мантиссы, то есть |Mx| - |My| = 0
Если 0 0, то z0 = 1, если 0 < 0, то z0 = 0.
Дробная часть мантиссы находится так же, как при операциях над числами с фиксированной запятой. Такой порядок действий вытекает из того, что:
½  |Mx| < 1,
½  |My| < 1,
2-1 < |Mx / My| < 2
То есть, возможно получение ненормализованной мантиссы. Для нормализации мантиссу необходимо сдвинуть вправо на один разряд и, чтобы не уменьшать при этом результат в два раза, нужно прибавить к порядку одну единицу.
При делении, так же, как и при умножении, возможно получение кода машинного нуля и кода бесконечности.

Сложение и вычитание

Обе операции выполняются по сходным алгоритмам.

X = 2mx * sign X.x1x2...xn
Y = 2my * sign Y.y1y2...yn
Z = X ± Y = 2max(mx,my).sign Z.z1z2...zn

Операция выполняется следующим образом:

  1. Находится разность порядков: mx – my = Δ
  2. Производится выравнивание порядков, при этом если разность порядков положительна, то в качестве порядка результата берётся mx, а мантисса My сдвигается вправо на |mx– my| разрядов; еcли разрядность порядков отрицательна, то денормализуется мантисса Mx.
  3. Производится алгебраическое суммирование мантисс слагаемых.
  4. Выполняется нормализация влево или вправо на соответствующее число разрядов с необходимым исправлением порядка.

Пример:

       порядок       мантисса
[mx]пк = 0.11 [Mx]пк = 0.1010
[my]пк = 0.10 [My]пк = 0.1110
Находим разность порядков:
    +00.11 = [mx]мок
     11.01 = [-my]мок
  1| 00.00
   |_ _1
     00.01 = [Δ]мок - разность порядков
Так как m x > my, то:
        +00.1010 = [Mx]мок
         00.0111 = [My]мок * 2-1
[Z]мок = 01.0001 – переполнение
         2-1 * [Z]мок = 00.1000 – нормализация
                max(mx,my) = [mx]мок = +00.11
                              [1]мок = 00.01
                             [mx]мок = 01.00 – переполнение порядка
Z = ∞

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

[mx]ок = 0.101 [Mx]ок = 0.10111101
[my]ок = 1.001 [My]ок = 0.10000001

Разность порядков:

+00.101 = [mx]мок
 00.110 = [-my]мок

[Δ]мок = 01.011 – то есть это число 11 10 , а в разрядной сетке мантиссы только 8 разрядов.
Поэтому операция блокируется, а результатом является число:

[mx] = 0.101 [Mx] = 0.10111101

Аналогичный случай может быть, когда разность порядков – отрицательна (отрицательное переполнение). В этом случае операция также блокируется, а результатом будет число с максимальным порядком.
Пример:

[mx]ок = 1.010 [Mx]ок = 1.10101011
[my]ок = 0.110 [My]ок = 1.11111111

Разность порядков:

       +  11.010 = [mx]мок
   11.001 = [-my]мок
   _______
+1| 10.011
         1
   _______
    10.100 = [Δ]мок

То есть разность порядков меньше (-8).
Операция блокируется, а результатом будет число:

[my]ок = 0.110 [My]ок = 1.11111111

Десятичные двоично-кодированные системы.

Иногда в ЭВМ используются десятичные системы счисления. Их выгодно использовать тогда, когда объем исходных данных для обработки на ЭВМ – велик, сама обработка производится по относительно несложным программам. На этом происходит значительная экономия времени, которая вытекает из того, что не нужно делать перевод из десятичной в двоичную систему и обратно.
Как правило, в состав оборудования таких ЭВМ вводится АУ, работающее с числами в десятичной системе счисления. Поскольку в качестве основного запоминающего элемента используется триггер-ячейка с двумя устойчивыми состояниями, то каждая десятичная цифра кодируется совокупностью двоичных символов.
Перевод чисел из десятичной системы в десятичную двоично-кодированную выполняется исключительно просто, поразрядно и одновременно по всей сетке:

879,65 10  1000 0111 1001, 0110 010110-2

Аналогично, выполняется и обратный перевод:

0110 1001, 0101 0011 10-2  69, 53 10

Существует большое разнообразие десятичных двоично-кодированных систем. Это многообразие вытекает из избыточности двоичного кода, при котором из 16 возможных комбинаций в каждом разряде используется по прямому информационному назначению лишь 10.
Наиболее широкое применение находят системы кодирования 8421 и 8421+3 (код Штибитца).
Система 8421 – неудобна тем, что при выполнении операции вычитания нет прямого перехода от цифры каждого разряда к дополнительному коду.
0000 - 0
0001 - 1
0010 - 2
0011 - 3
0100 - 4
0101 - 5
0110 - 6
0111 - 7
1000 - 8
1001 - 9
В то же время эта система обладает свойством аддитивности , поскольку результаты операции сложения над числами в десятичной системе и над их изображением в системе 8421 – совпадают.
Система 8421+3 - более интересна, т.к. она обладает свойством самодополнения. Видно, что дополнение до 9 можно получить, применяя операцию поразрядного инвертирования кода.
0011 – 0
0100 – 1
0101 – 2
0110 – 3
0111 – 4
1000 – 5
1001 – 6
1010 – 7
1011 – 8
1100 – 9
Всего существует А1610 = 2,9•1010 вариантов 10-ых двоично-кодированных систем.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика