Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Элементы вычислительной математики Учебное пособие по курсу Информатика.doc
Скачиваний:
91
Добавлен:
07.03.2015
Размер:
2.16 Mб
Скачать

1. Машинная арифметика и ошибки вычислений.

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

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

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

В машинных вычислениях участвуют числа двух типов: целые числа и вещественные числа (так называемые числа с «плавающей запятой»). В отличие от общепринятой арифметики с десятичной системой исчисления работа компьютеров основана на двоичной системе чисел, т.е. в виде последовательностей нулей и единиц, при этом всегда для представления любого числа в памяти компьютера выделяется строго ограниченное количество разрядов. В частности, языке программирования Турбо-Паскаль для целых чисел типа byte выделяется один байт машинной памяти, поэтому переменные данного типа могут принимать значения в диапазоне от 0 до 28-1=255. Для хранения целых чисел типа word и integer выделяются 2 байта памяти, поэтому для типа word, в котором могут быть представлены только неотрицательные числа, диапазон допустимых значений ограничен величинами от 0 до 216-1=65535. Числа типа integer могут быть положительными или отрицательными, их диапазон ограничен значениями от до. Если работать с целыми числами, далекими от границ числовой области компьютера, то машинная арифметика дает правильные результаты, например 5+7=12, 8-27=-19, 273=81 и т.д. Деление целых чисел снова приводит к целому числу, а в качестве результата операции принимается частное, а остаток отбрасывается. Это означает, что и т.д.

Если результат операции над целыми числами слишком велик или слишком мал для данного типа переменных, то при отсутствии контроля за превышением допустимого диапазона результат будет заменен по циклическому правилу. Например, если переменным a и b присвоить тип byte, переменной a присвоить значение a=255 , а переменной b – значение b=a+1, то компьютер выдаст результат: b=0, при b=a+2 получим b=1 и т.д. Если a и b отнести к переменным типа integer и присвоить a=32767, то при b=a+1 получим b=-32768, при b=a+2  b=-32767. Эти ошибки не будут замечены, и программа продолжит дальнейшую работу с неверными значениями переменных.

Если в программе предусматривается проверка переполнения допустимого диапазона переменных, то при выходе значения за пределы диапазона на экран выводится сообщение об ошибке, а работа программы приостанавливается.

Десятичные числа вещественного типа с «плавающей запятой» представляются в виде . Числоa называется мантиссой, а b – показателем. Обычно число b целое, а у числа a слева от десятичной запятой находится только один знак. У обоих чисел a и b количество разрядов конечно, поэтому имеется лишь конечное множество чисел с плавающей запятой и, в частности, существуют наибольшие и наименьшие числа с плавающей запятой.

Если результат операции превышает наибольшее значение, то происходит переполнение выделенных ячеек памяти, и работа программы на этом прекращается. Если результатом операции является число, слишком близкое к нулю, то происходит исчезновение порядка. Компьютер заменяет результат нулем без какого-либо сообщения об этой операции. Во многих случаях подобная замена не приводит к появлению заметных погрешностей в окончательном результате, однако, иногда подобные округления при операциях умножения и последующего деления, сложения или вычитания малых по абсолютной величине чисел могут вызвать принципиальные ошибки результатов вычислений.

Наибольшее значение, при котором происходит обнуление результата, называется машинным нулем. Эта величина зависит от типа переменных, с которыми производятся операции, численного значения переменных и типа компьютера. Для оценки погрешности округления используется понятие машинного эпсилон маш, численно равного наименьшему числу, которое при сложении с вещественным числом 1 дает результат, больший чем 1. Величину маш можно определить с помощью следующей программы:

Program Nul;

var

x, eps: real{single, double, extended};

BEGIN

eps:=1;

repeat

eps:=eps/2;

x:=1+eps;

until x<=1;

writeln(‘eps=’,eps);

readln;

END.

В табл.1.1. приведены результаты тестирования компьютера Pentium с различными типами данных при операции сложения x=A+0.

Таблица 1.1.

Результаты вычисления машинного нуля 0

Тип переменных

А

1

2

100

single

5,9610-8

1,1910-7

3,8210-6

real

4,5510-13

9,0510-13

2,9110-11

double

1,1110-16

2,2210-16

7,1110-15

Extended

5,4210-20

1,0810-19

3,4710-18

Наличие машинного эпсилон проявляется следующим образом. Например, запись вещественного числа 0,3 в память компьютера сопряжена с ошибкой, поскольку величина 0,3 не имеет точного двоичного представления в системе вещественных чисел с плавающей запятой. Поэтому сумма десяти шагов длиной 0,3 не будет точно равна одному шагу длиной 3,0. Подобные малые ошибки при длительных расчетах могут накапливаться и приводить к более заметным суммарным ошибкам.

Погрешность представления вещественного числа в программе локализуется в последнем бите памяти. Более серьезные последствия может вызвать неудачное использование вычислительных алгоритмов.

Рассмотрим пример вычисления значений функции . Эта функция может быть представлена как сумма бесконечного ряда

. (1.1)

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

Таблица 1.2

Точные и рассчитанные с помощью ряда значения функции y=ex при представлении вещественных чисел типом real.

X

Точное

Значение y=ex

Длина ряда

для всех х

при x0;

при x<0.

50

100

500

50

-30

9,35810-14

8,782108

-2,58810-1

-2,58810-1

9,36010-14

-20

2,06110-9

1,047100

3,50510-5

3,50510-5

2,06110-9

-10

4,54010-5

4,54010-5

4,54010-5

4,54010-5

4,54010-5

0

1

1

1

1

1

10

2,203104

2,203104

2,203104

2,203104

2,203104

20

4,852108

4,852108

4,852108

4,852108

4,852108

30

1,0691013

1,0681013

1,0691013

1,0691013

1,0681013

В диапазоне значений [-10,+30] при 50 членах ряда рассчитанные по (1.1) значения практически полностью совпадают с точными, определенными по более сложному алгоритму. Однако при x=-20 ошибка расчета составляет 9 порядков, а при x=-30 - 22 порядка. Увеличение длины ряда до 100 членов снижает расхождения между точными и расчетными значениями, но не приводит к точному результату. Дальнейшее увеличение длины ряда до 500 членов не оказывает заметного влияния на результаты расчета.

Представление вещественных чисел типом extended с 19-20 значащими цифрами позволяет при 100 членах ряда получить практически точное значение для x=-20, однако при x=-30 ошибка вычисления составляет 6 порядков. Эта погрешность сохраняется при дальнейшем увеличении длины ряда.

Таблица 1.3

Точные и рассчитанные с помощью ряда значения функции y=ex при представлении вещественных чисел типом extended.

X

Точное

Значение y=ex

Длина ряда

для всех х

при x0;

при x<0.

50

100

500

50

-30

9,35810-14

8,782108

-5,73610-8

-5,73610-8

9,36010-14

-20

2,06110-9

1,047100

2,06010-9

2,06010-9

2,06110-9

-10

4,54010-5

4,54010-5

4,54010-5

4,54010-5

4,54010-5

0

1

1

1

1

1

10

2,203104

2,203104

2,203104

2,203104

2,203104

20

4,852108

4,852108

4,852108

4,852108

4,852108

30

1,0691013

1,0681013

1,0691013

1,0691013

1,0681013

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

. (1.2)

Вычисленные по этому ряду значения приведены в правых столбцах табл. 1.2 и 1.3.

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

Из приведенных выше примеров следует, что разработку компьютерных вычислительных программ нельзя рассматривать как чисто формальную процедуру. Каждая программа должна учитывать конкретные особенности реальной задачи, содержать блоки, контролирующие вычислительный процесс (вывод промежуточных результатов расчета, контроль за переполнением допустимых диапазонов чисел, оценка погрешностей приближенных вычислений и т.д.), и пройти проверку на тестовой задаче перед решением основной.