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