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
(мантиссы в прямом коде)
На первом этапе производится сравнение порядков путем вычитания (S = Pa - Pb).
При возникновении переполнения операция блокируется и в качестве результата принимается число А или В. В случает положительного переполнения (если Pa >> Pb) результатом принимается число А. Если же переполнение отрицательное – результатом принимается число В. Если переполнения нет знак S будет показывать какой из порядков меньше: Ns=0 => Pa>Pb, Ns=1 => Pb>Pa. Меньшему из порядков присваивается значение большего, а мантиссу меньшего числа сдвигают вправо на S двоичных разрядов с занесением нулей. Если в процессе выравнивания порядков одна из мантисс стала равной нулю то операцию блокируют и в качестве результата принимают большее число. Если операция выравнивания завершилась без блокировок то переходят к этапу суммирования/вычитания мантисс.
Действие над числами (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)).
При сложении может возникнуть перенос из старшего разряда в несуществующий т.е. возникло переполнение разрядной сетки или нарушение нормализации влево. Для получения правильного результата мантиссу следует сдвинуть вправо на 1 разряд (с занесением 1), а к порядку результата добавить единицу (при этом необходимо следить чтобы небыло переполнения). Если переполнение возникло то устанавливают код положительного переполнения и завершают операцию.
При вычитании мантисс, аналогично, может возникнуть (а может и нет) нарушение нормализации вправо. В случае нарушения нормализации мантиссу необходимо сдвигать влево до получения 1 в старшем разряде. При каждом сдвиге необходимо вычитать 1 из порядка результата. Если возникнет отрицательное переполнение (при вычитании порядка) то нужно установить код антипереполнения (англ. термин) и завершить операцию.
Деление.
A = Na'Ma*2^Pa
B = Nb'Ma*2^Pb
D = A / B.
D = (Na xor Nb)'(Ma/Mb)*2^(Pa-Pb)
Проверка мантиссы делителя на 0 (Mb=0 ?). Если она равна 0, то формируют код переполнения и завершают операцию
Проверка мантиссы делимого на 0 (Ma=0 ?). Если да, то формируют код полного нуля и завершают операцию.
Если Mb<>0 и Ma<>0 то приступают к операции вычитания порядков: Pd = Pa – Pb.
Выполняют деление нормализованных мантисс.
Производят нормализацию результата с отслеживанием переполнения разрядной сетки.
Умножение.
A = Na'Ma*2^Pa
B = Nb'Ma*2^Pb
C = (Na xor Nb)'(Ma*Mb)*2^(Pa+Pb)
Проверка мантисс сомножителей на 0. Если хотябы одна из мантисс равна 0, то устанавливают код полного нуля и завершают операцию.
Выполняют суммирование порядков (Pc = Pa + Pb).
Перемножают мантиссы (Mc = Ma * Mb).
Выполняют нормализацию и отслеживают переполнения.