Сложение и вычитание
Обе операции выполняются по сходным алгоритмам.
X = 2mx * sign X.x1x2...xn
Y = 2my * sign Y.y1y2...yn
Z = X ± Y = 2max(mx,my).sign Z.z1z2...zn
Операция выполняется следующим образом:
- Находится разность порядков: mx – my = ?
- Производится выравнивание порядков, при этом если разность порядков положительна, то в качестве порядка результата берётся mx, а мантисса My сдвигается вправо на |mx– my| разрядов; еcли разрядность порядков отрицательна, то денормализуется мантисса Mx.
- Производится алгебраическое суммирование мантисс слагаемых.
- Выполняется нормализация влево или вправо на соответствующее число разрядов с необходимым исправлением порядка.
Пример:
порядок мантисса [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