Рассмотрим еще одну ситуацию, типичную для операции над числами в форме с плавающей запятой.
Пусть необходимо вычислить разницу чисел
X=13,45 и Y=13,45*10**(-5) ,
при условии, что они представлены в форме с плавающей запятой при разрядности мантиссы, равной 4, и порядка, равной 2. Для простоты операцию проиллюстрируем на примере десятичной системы счисления.
Запишем числа Х и Y в форме с плавающей запятой:
X: 1 3 4 5 + 0 2
Y: 1 3 4 5 - 0 3
Как видно из этой записи, оба числа представлены в форме с плавающей запятой без искажения. Не воспроизводя логику вычитания, принятую в ЭВМ, выполним вычитание в столбик. Для этого представим оба операнда в естественной форме и так, чтобы соответствующие разряды операндов находились друг под другом :
X: 1 3 , 4 5
Y: 0 , 0 0 1 3 4 5
=============
Округлим результат, учитывая, что в нашем распоряжении для записи цифр числа имеется всего 4 разряда, и запишем его вновь в форме с плавающей запятой, в заданной разрядной сетке:
Сравнив результат с исходными операндами увидим, что хотя оба операнда были отличны от нуля, результат и уменьшаемое полностью совпадают!
Вывод. При вычитании двух чисел большое значение имеют соотношение их величин и разрядность мантисс, используемая для их кодирования. Так что программисты могут столкнуться с нежелательными последствиями выполнения указанных действий в некоторых критических местах алгоритма. Например, если подобное вычитание выполняется в условии прекращения цикла, имеющем вид “(X-Y)>0.01”, то данное условие может никогда не выполниться, т.е. произойдет так называемое зацикливание.
Дополнительная литература по материалу раздела.
1. Савельев А.Я. Прикладная теория цифровых автоматов. Учебник для втузов. М.: 1989.