Сложение вещественных чисел
Порядок действий при сложении вещественных чисел гораздо сложнее, нежели для целых чисел. Он приводится ниже:
1) слагаемые размещаются в разрядных сетках (см. п. 9.3.2.2) в прямых кодах;
2) определяется, порядок какого слагаемого меньше и насколько меньше. Для этого из любого из двух порядков вычитается оставшийся порядок и анализируется результат: если результат положителен, то большим порядком является уменьшаемое, если отрицателен, – то вычитаемое. Значение результата используется в следующих двух шагах. При вычитании, очевидно, выполняется сложение в обратном или дополнительном коде, причем в случае работы с порядками, которые являются целыми числами, эта операция идентична рассмотренной в п. 9.3.4.1;
3) порядок слагаемого, имеющий меньшее значение, увеличивается, становясь равным большему слагаемому. Если порядок отрицателен, он увеличивается, будучи преобразован в обратный или дополнительный код, по правилам, рассмотренным в п. 9.3.4.1;
4) числовые разряды мантиссы слагаемого с меньшим порядком сдвигаются вправо на столько разрядов, на сколько был увеличен меньший порядок. Часть разрядов при этом теряется, а оставшиеся свободными разряды заполняются нулями;
5) мантиссы складываются. При этом отрицательные мантиссы переводятся в обратный или дополнительный код и складываются по правилам, рассмотренным в п. 9.3.4.1. Результату приписывается общий (выровненный в предыдущих шагах) порядок;
6) в случае необходимости мантисса результата нормализуется. Необходимость нормализации определяется старшим числовым разрядом мантиссы: если он равен 0, нормализация нужна. Для этого мантисса сдвигается влево на нужное количество разрядов, а порядок уменьшается на соответствующее число. При этом, очевидно, уменьшение порядка выполняется как сложение с константой в обратном или дополнительном коде. Оставшиеся незаполненными младшие разряды мантиссы заполняются нулями.
Пример 9.12. Сложить в дополнительном коде числа 0,10112Е-2 и –0,10012Е-3. Разрядная сетка из девяти разрядов, из них четыре разряда – под порядок, пять разрядов – под мантиссу.
Решение показано ниже:
1) разместим слагаемые в разрядных сетках. Имеем:
(9.13) |
|
-0,10012Е-3
2) вычитаем из порядка –2 порядок –3. Имеем: -2 – (-3) = -2 + 3. Таким образом, надо сложить числа –2 и +3 в дополнительном коде, располагая разрядной сеткой в 4 разряда (мы на время «забудем» о мантиссе). При выполнении сложения используются правила сложения в дополнительном коде для целых чисел.
Имеем:
Прямые коды | Обратные коды | Дополнительные коды | |||||||||||||||
Результат сложения: |
Поскольку результат положителен, он представлен в прямом коде.
Таким образом, большим порядком обладает первое слагаемое (действительно, -2 > -3). Порядок больше на 1.
3) меньший порядок, принадлежащий числу –0,10012Е-3, увеличивается на 1, что следует из предыдущего шага, т.е. выполняется действие: -3 + 1. Это действие заменяется сложением в дополнительном коде.
Имеем (разрядная сетка соответствует порядку):
Прямые коды | Обратные коды | Дополнительные коды | |||||||||||||||
Результат сложения: |
Поскольку результат отрицателен, он представлен в дополнительном коде. Выполним преобразование сначала в обратный код, затем в прямой код. Имеем:
Таким образом, результат увеличения меньшего порядка равен –102 = -2.
4) сдвиг числовых разрядов мантиссы из (9.13) на один разряд вправо (на время «забываем» о порядке):
5) сложение мантисс. Поскольку второе слагаемое имеет отрицательный знак, сложение выполняется в дополнительном коде. Имеем:
Прямые коды | Обратные коды | Дополнительные коды | ||||||||||||||||
Результат сложения: |
Поскольку результат положителен, он представлен в прямом коде. После приписывания результату общего, выровненного порядка имеем:
6) поскольку старший числовой разряд мантиссы равен 0, она требует нормализации. Для этого:
· сдвигаем числовые разряды мантиссы на один разряд влево. Освободившийся младший разряд заполняем нулем. Имеем:
· поскольку мантисса увеличилась при сдвиге на один порядок, уменьшаем порядок на 1. Имеем: -102 –12 (или –2 –1). Для сложения отрицательных чисел переведем их в дополнительный код. Тогда:
Прямые коды | Обратные коды | Дополнительные коды | ||||||||||||||||
Результат сложения: |
Поскольку результат отрицателен, он представлен в дополнительном коде. Переведем его сначала в обратный код, затем – в прямой код. Имеем:
После преобразования результат имеет вид:
Поскольку старший числовой разряд мантиссы равен единице, она нормализована.
Таким образом, получен результат 0,1112 Е-3.
При сложении вещественных чисел также возникают ситуации переполнения, с которыми компьютер справляется самостоятельно. Рассмотрим еще один пример.
Пример 9.13. Сложить в дополнительном коде числа -0,11002Е4 и –0,10002Е4. Разрядная сетка из девяти разрядов, из них четыре разряда – под порядок, пять разрядов – под мантиссу.
1) разместим слагаемые в разрядных сетках. Имеем:
(9.14) |
(9.15) |
2) вычитаем из порядка 4 порядок 4. Имеем: 4 – 4. Для сложения чисел в дополнительном коде выполним сначала необходимый перевод, а затем - сложение.
Имеем:
Прямые коды | Обратные коды | Дополнительные коды | |||||||||||||||
Результат сложения: |
Поскольку результат равен нулю, порядки слагаемых равны и никаких преобразований по выравниванию порядков (шаги 2 – 4 из приведенной выше последовательности действий) не требуется. Поэтому сразу складываем мантиссы. Поскольку оба слагаемых отрицательны, переведем их сначала в обратный, затем в дополнительный коды. Имеем:
Прямые коды | Обратные коды | Дополнительные коды | ||||||||||||||||
Результат сложения: |
Полученный результат положителен, несмотря на то, что складывались отрицательные слагаемые. Это является формальным признаком переполнения разрядной сетки. В этом случае выполняются следующие действия:
1) мантисса результата вместе со знаком сдвигается вправо на один разряд. Таким образом, старший разряд мантиссы становится равным ее знаковому разряду. При этом, очевидно, теряется младший числовой разряд;
2) знаковый разряд результата приравнивается знаковому разряду слагаемых;
3) порядок увеличивается на единицу.
Для нашего примера имеем следующие действия:
1) сдвиг мантиссы («забываем» о порядке):
2) формирование знакового разряда дает результат:
3) формирование порядка: к порядку +4 прибавляется 1. Оба слагаемых положительны, поэтому никаких преобразований не требуется. Имеем:
| ||||
| ||||
Таким образом, результат примера 9.13 имеет вид:
дополнительный код результата |
обратный код результата |
|
Очевидно, не всегда компьютер в состоянии справиться с переполнением при сложении вещественных чисел. Ограничением является размер разрядной сетки порядка.