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