|
При выполнении вычислительных операций с помощью настольного калькулятора легко обнаружить любые арифметические ошибки. Если же мы имеем дело с ЭВМ, ошибки в большинстве своем скрыты от наших глаз. Кроме того, вычисления производятся со скоростью до миллиона операций в секунду, и проследить за ними совершенно невозможно. Существует, однако, несколько типов ошибок, которые настолько серьезны, что пользователь предупреждается о них аппаратными средствами, — это деление на нуль, переполнение и потеря значимости.
Большинство затруднений бывает связано с тем, что количество разрядов действительных чисел, подлежащих хранению в памяти, ограничено. Даже в логически правильной программе долго не замечаемая ошибка может вызвать губительные последствия. Часто такие ошибки обнаруживаются лишь тогда, когда новая совокупность исходных данных приводит к явно неверным результатам. Все это происходит потому, что точность представления действительных чисел в машине предопределена заранее. Пусть, например, при выполнении операций
А = 1.0/3.0 получается число 0.3333333
В = А*3 получается число 0.9999999
Неосторожный программист может необдуманно, вставить в такую программу оператор условного перехода
И7 (В = 1) ...
Другая серьезная ошибка может быть связана с использованием оператора
1=В, где I — целое число, а В — действительное число 0.9999999. Результат выполнения этой операции, хранимый в I, окажется нулем вследствие отбрасывания дробной части.
Аналогичные ошибки могут возникать при сложении и вычитании.
Предположим, что мы имеем дело с машиной, которая способна выполнять арифметические операции только над четырехразрядными десятичными числами. Пусть это будут числа
X = 999.0 У = —1000. г = .001 и требуется вычислить х + у + г + 1.о
Приняв последовательность действий
((х + у) -ьг) + 1.о получим
((999.0 - 1000.) + .001) + 1.0=(—1.0 + .001) + 1.0 = = —.999 + 1.0 = .001
Выполняя действия в другом порядке, будем иметь уже другой результат:
X + (У + 7) + 1.0 = 999.0 (—1000. + .001) + 1.0 = = 999.0 + (—1000.) + Г.О = —1.0 + 1.0 = 0.0
В данном случае произошла потеря точности из-за наличия всего лишь четырех разрядов. Опасность, следовательно, кроется там, где производится вычитание двух почти равных чисел, поскольку в этом случае легко потерять все значащие разряды. Такая ситуация, называемая потерей разрядов, может возникать в машинах любой разрядности. Часто оказывается, что потерянные разряды — наиболее важные, особенно когда получающееся число вообще не содержит значащих цифр.
⇐4.21. "Психология" программных ошибок || Оглавление || 4.23. Обнаружение ошибок⇒
|