Px – числа со знаком(в данном примере дополнительный код, хотя часто используют ОН)

Mx – числа без знака


Стандартные коды:


Переполнение: Nx=0, Px=1..1, Mx = 1..1.

Антипереполнение: Nx=1, Px=1..1, Mx = 1..1.

Полный ноль: Nx=0, Px=0..0, Mx = 0..0.

(записи в двоичных кодах. 1..1 – все биты установлены в 1, 0..0 - аналогично).


Алгоритм сложения и вычитания чисел с ПЗ.


A = +0.1011*2^4 (Na = 0 Ma = .1011 Pa = +4)

B = -0.1101*2^2 (Nb = 1 Mb = .1101 Pa = +2)

C = A +/- B


(мантиссы в прямом коде)


  1. На первом этапе производится сравнение порядков путем вычитания (S = Pa - Pb).

  2. При возникновении переполнения операция блокируется и в качестве результата принимается число А или В. В случает положительного переполнения (если Pa >> Pb) результатом принимается число А. Если же переполнение отрицательное – результатом принимается число В. Если переполнения нет знак S будет показывать какой из порядков меньше: Ns=0 => Pa>Pb, Ns=1 => Pb>Pa. Меньшему из порядков присваивается значение большего, а мантиссу меньшего числа сдвигают вправо на S двоичных разрядов с занесением нулей. Если в процессе выравнивания порядков одна из мантисс стала равной нулю то операцию блокируют и в качестве результата принимают большее число. Если операция выравнивания завершилась без блокировок то переходят к этапу суммирования/вычитания мантисс.

  3. Действие над числами (A и B) = 0 (сложение) или 1 (вычитание). Действие над мантиссами Dm = ((D xor Na) xor Nb). W = 0 (Mb > Ma) или 1 (Ma > Mb). Знак результата Nc = (W and Na) or ((not W) and (Nb xor D)).

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

  5. При вычитании мантисс, аналогично, может возникнуть (а может и нет) нарушение нормализации вправо. В случае нарушения нормализации мантиссу необходимо сдвигать влево до получения 1 в старшем разряде. При каждом сдвиге необходимо вычитать 1 из порядка результата. Если возникнет отрицательное переполнение (при вычитании порядка) то нужно установить код антипереполнения (англ. термин) и завершить операцию.


Деление.


A = Na'Ma*2^Pa

B = Nb'Ma*2^Pb


D = A / B.

D = (Na xor Nb)'(Ma/Mb)*2^(Pa-Pb)


  1. Проверка мантиссы делителя на 0 (Mb=0 ?). Если она равна 0, то формируют код переполнения и завершают операцию

  2. Проверка мантиссы делимого на 0 (Ma=0 ?). Если да, то формируют код полного нуля и завершают операцию.

  3. Если Mb<>0 и Ma<>0 то приступают к операции вычитания порядков: Pd = Pa – Pb.

  4. Выполняют деление нормализованных мантисс.

  5. Производят нормализацию результата с отслеживанием переполнения разрядной сетки.


Умножение.


A = Na'Ma*2^Pa

B = Nb'Ma*2^Pb


C = (Na xor Nb)'(Ma*Mb)*2^(Pa+Pb)


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

  2. Выполняют суммирование порядков (Pc = Pa + Pb).

  3. Перемножают мантиссы (Mc = Ma * Mb).

  4. Выполняют нормализацию и отслеживают переполнения.


Рейтинг@Mail.ru