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

 

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

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 имеет вид:

 

 

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

 

⇓в обратный код

⇓в прямой код

 

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