Сложение вещественных чисел

Порядок действий при сложении вещественных чисел гораздо сложнее, нежели для целых чисел. Он приводится ниже:

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,10112Е-2

(9.12)
1

-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)
-0,11002 Е4

(9.15)
-0,10002 Е4

2) вычитаем из порядка 4 порядок 4. Имеем: 4 – 4. Для сложения чисел в дополнительном коде выполним сначала необходимый перевод, а затем - сложение.

Имеем:

Прямые коды       Обратные коды       Дополнительные коды
           
           
                Результат сложения:

Поскольку результат равен нулю, порядки слагаемых равны и никаких преобразований по выравниванию порядков (шаги 2 – 4 из приведенной выше последовательности действий) не требуется. Поэтому сразу складываем мантиссы. Поскольку оба слагаемых отрицательны, переведем их сначала в обратный, затем в дополнительный коды. Имеем:

Прямые коды     Обратные коды     Дополнительные коды
       
       
                Результат сложения:

Полученный результат положителен, несмотря на то, что складывались отрицательные слагаемые. Это является формальным признаком переполнения разрядной сетки. В этом случае выполняются следующие действия:

1) мантисса результата вместе со знаком сдвигается вправо на один разряд. Таким образом, старший разряд мантиссы становится равным ее знаковому разряду. При этом, очевидно, теряется младший числовой разряд;

2) знаковый разряд результата приравнивается знаковому разряду слагаемых;

3) порядок увеличивается на единицу.

Для нашего примера имеем следующие действия:

1) сдвиг мантиссы («забываем» о порядке):

     

2) формирование знакового разряда дает результат:

3) формирование порядка: к порядку +4 прибавляется 1. Оба слагаемых положительны, поэтому никаких преобразований не требуется. Имеем:

слагаемые
0

результат
0

Таким образом, результат примера 9.13 имеет вид:

дополнительный код результата
Поскольку мантисса результата отрицательна, она представлена в дополнительном коде и требует перевода в прямой код. Для этого выполним соответствующие преобразования. Имеем:

обратный код результата

прямой код результата
0

Очевидно, не всегда компьютер в состоянии справиться с переполнением при сложении вещественных чисел. Ограничением является размер разрядной сетки порядка.

Наши рекомендации