Особенности арифметических операций над числами



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

· Во-первых, к тому, что при выполнении арифметической операции теоретически возможно формирование результата, который попадает в области 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.


Дата добавления: 2019-07-15; просмотров: 298; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!