Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspekt_dn.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.46 Mб
Скачать

Ловушки вычислений

Полученная оценка относительной погрешности содержит в знаменателе выражение |1 – x|. Ясно, что при х ≈ 1 можем получить очень большую погрешность. В связи с этим рассмотрим подробнее случай вычитания близких чисел.

Запишем выражение для относительной погрешности разности двух чисел в виде

При а ≈ b эта погрешность может быть сколь угодно большой.

Пример 2. Пусть а = 2520, b = 2518. В этом случае имеем абсолютные погрешности исходных данных ∆а = ∆b = 0.5 и относительные погрешности δa ≈ δb = 0.5/2518 ≈ 0.0002 (0.02%). Относительная погрешность разности равна

Следовательно, при малых погрешностях в исходных данных мы получили весьма неточный результат. Нетрудно подсчитать, что даже при случайных изменениях а и b на единицу, в последних разрядах их разность может принимать значения 0, 1, 2, 3, 4. Поэтому, при организации вычислительных алгоритмов следует избегать вычитания близких чисел; при возможности алгоритм нужно видоизменить во избежание потери точности на некотором этапе вычислений.

Из рассмотренных правил следует, что при сложении или вычитании приближенных чисел желательно, чтобы эти числа обладали одинаковыми абсолютными погрешностями, т. е. одинаковым числом разрядов после десятичной точки. Например, 38.723+4.9=43.6; 425.4-0.047=425.4. Учет отброшенных разрядов не повысит точность результатов. При умножении и делении приближенных чисел количество значащих цифр выравнивается по наименьшему из них.

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

Пусть требуется найти сумму пяти четырехразрядных чисел: S = 0.2764 + 0.3944 + 1.475 + 26.46 + 1364. Складывая все эти числа, а затем, округляя полученный результат до четырех значащих цифр, получаем S = 1393. Однако при вычислении на машине округление происходит после каждого сложения. Предполагая условно сетку четырехразрядной, проследим вычисление на машине суммы чисел от наименьшего к наибольшему, т. е. в порядке их записи: 0.2764 + 0.3944 = 0.6708, 0.6708 + 1.475 = 2.156, 2.156 + 26.46 = 28.62, 28.62 + 1364 = 393; получили S1 = 1393, т. е. верный результат. Изменим теперь порядок вычислений и начнем складывать числа последовательно от последнего к первому: 1364 + 26.46 = 1390, 1390 + 1.475 = 1391, 1391 + 0.3944 = 1391, 1391 + 0.2764 = 1391; здесь окончательный результат S1 = 1391, он менее точный.

Анализ процесса вычислений показывает, что потеря точности здесь происходит из-за того, что прибавления к большому числу малых чисел не происходит, поскольку они выходят за рамки разрядной сетки (а + b = а при а » b). Этих малых чисел может быть очень много, но на результат они все равно не повлияют, поскольку прибавляются по одному. Здесь необходимо придерживаться правила, в соответствии с которым сложение чисел нужно проводить по мере их возрастания. В машинной арифметике из-за погрешности округления существен порядок выполнения операций, и известные из алгебры законы коммутативности (и дистрибутивности) здесь не всегда выполняются.

Максимальная относительная погрешность при округлении есть δmax=0.5α1-k, где α — основание системы счисления, k— количество разрядов мантиссы числа. При простом отбрасывании лишних разрядов эта погрешность увеличивается вдвое.

При решении задачи на ЭВМ нужно использовать подобного рода «маленькие хитрости» для улучшения алгоритма и снижения погрешностей результатов. Например, при вычислении на ЭВМ значения (а +х)2 величина х может оказаться такой, что результатом сложения а + х получится а (при х « а); в этом случае может помочь замена (а + х)2 = а2 + 2ах + х2.

Рассмотрим еще один важный пример — использование рядов для вычисления значений функций. Запишем, например, разложение функции sin(х) по степеням аргумента:

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

Вычислим значение функции sin(х) при х = 0.5236 (30°). Члены ряда, меньшие 10-4, не будем учитывать. Вычисления проведем с четырьмя верными знаками. Получим

Это отличный результат в рамках принятой точности. Зная из курса высшей математики, что это разложение синуса справедливо при любом значении аргумента (-∞ < х < ∞), используем его для вычисления функции при х =6.807 (390°). Опуская вычисления, получаем sin(6.807) ≈ 0.5493. Относительная погрешность составляет здесь около 10% (вместо ожидаемого значения 0.01% по признаку Лейбница). Это объясняется погрешностями округлений и способом суммирования ряда (слева направо, без учета величины членов).

Нe всегда помогает и повышенная точность вычислений. В частности, для данного ряда при х = 25.66 (1470° = 4 ⋅ 360°+30°) даже при учете членов ряда до 10 и вычислениях с восемью значащими цифрами в результате аналогичных вычислений (суммирование слева направо) получается результат, не имеющий смысла: sin(25.66) ≈ 24.

В программах, использующих степенные ряды для вычисления значений функций, могут быть приняты различные меры по предотвращению подобной потери точности. Так, для тригонометрических функций можно использовать формулы приведения, благодаря чему аргумент будет находиться на отрезке [0, 1].

При вычислении экспоненты аргумент х можно разбить на сумму целой и дробной частей (ex = en+a = enea) и использовать разложение в ряд только для еa, а еn вычислять умножением.

Таким образом, при организации вычислений можно своевременно распознать подобные «подводные камни», когда возможна потеря точности, и попытаться затем исправить положение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]