
1.4.Погрешность произвольной функции
Пусть задана произвольная функция u
= f(x1,
x2, …,xn),
где x1, x2,
…,xn
— приближенные величины, а
— их известные предельные абсолютные
погрешности. Тогда предельная абсолютная
погрешность результата — функции u
— для малых
вычисляется по формуле [7]:
(1.17)
Как видно из формулы (1.17), для ее применения требуется, чтобы функция f(x1, x2, …,xn) была дифференцируемой по всем переменным.
Пример 1.17. Вычислить функцию
,
если
и
.
Найти предельные абсолютную и относительную
погрешности результата и определить
число верных значащих цифр.
Решение. Применяя формулу (1.17), имеем
Для функции u находим
.
Учитывая предельную абсолютную
погрешность u
≈ 0,04, получаем, что результат имеет две
верные значащие цифры в узком смысле.
Ответ можно записать в виде u
= 1,4 ± 0,04.
1.5.Представление чисел в компьютере и погрешность
Так как для записи числа в компьютере выделяется ограниченная область памяти, то числовые значения ограничены. Границы значений зависят от типа числа и конкретной среды программирования или математического пакета. В таблице 1.1 представлены диапазоны значений чисел различных типов в языке программирования C.
Табл. 1.1
Тип |
Размер памяти в байтах |
Диапазон возможных значений |
short int |
2 |
–32768 <= n <= 32767 |
long int |
4 |
–2147483648 <= n <= 2147483647 |
unsigned short int |
2 |
0 <= n <= 65535 |
unsigned long int |
4 |
0 <= n <= 4294967295 |
float |
4 байта = 32 бита 1— знак, 8 — экспонента, 23 — мантисса |
Приблизительно 1,17∙10–38 < x < 3,4∙10+38 |
double |
8 байт = 64 бита 1— знак, 11 — экспонента, 52 — мантисса |
Приблизительно 2,22∙10–308 < x < 1,79∙10+308 |
long double |
10 байт = 80 бит |
3,4∙10–4932 < x < 3,4∙10+4932 |
Если при вычислениях для переменной типа float будет получено число с порядком меньшим чем –38, оно будет заменено нулем, а если порядок числа превысит 38, то произойдет так называемый «аварийный останов» (система прекратит выполнение программы пользователя) и выведено сообщение о переполнении порядка. Для переменной типа float число с порядком меньшим чем –38 является нулем, а число с порядком большим, чем 38 — бесконечностью. Для переменной типа double нулем являются значения с порядком меньшим чем –308, а бесконечностью — значения с порядком большим, чем 308.
В таблице 1.2 приведены константы для чисел с плавающей точкой стандартной библиотеки языка программирования C.
Табл. 1.2
Константа |
Описание константы |
Значение
|
FLT_DIG |
Количество верных десятичных цифр в объекте типа float |
6 |
FLT_EPSILON |
Минимально возможное значение переменной типа float, такое, что 1.0 + FLT_EPSILON ≠ 1.0 |
1.192093e–07 |
FLT_MAX |
Максимальное число с плавающей точкой типа float |
3.402823e+38 |
FLT_MIN |
Минимальное число с плавающей точкой типа float |
1.175494e–38 |
DBL_DIG |
Количество верных десятичных цифр в объекте типа double |
15 |
DBL _EPSILON |
Минимально возможное значение переменной типа double, такое, что 1.0 + DBL_EPSILON ≠ 1.0 |
2.220446e–16 |
DBL _MAX |
Максимальное число с плавающей точкой типа double |
1.797693e+308 |
DBL _MIN |
Минимальное число с плавающей точкой типа double |
2.225074e–308 |
LDBL_DIG |
Количество верных десятичных цифр в объекте типа long double |
18 |
LDBL _EPSILON |
Минимально возможное значение переменной типа long double, такое, что 1.0 + LDBL_EPSILON ≠ 1.0 |
|
LDBL _MAX |
Максимальное число с плавающей точкой типа long double |
|
LDBL _MIN |
Минимальное число с плавающей точкой типа long double |
|
В программах OpenOffice Calc, Microsoft Excel и Mathcad границы значений числа приблизительно соответствуют типу double языка C. Мантисса может содержать до 15 десятичных цифр. Например, число десятичных знаков числа с плавающей точкой в программе Excel можно найти очень простым способом: записать в ячейку формулу =1/3 и с помощью команды меню «формат ячейки» определить формат «числовой с 20 знаками после запятой». Мы увидим, что мантисса числа содержит 15 (значащих) десятичных цифр, остальные цифры равны нулю.
Если в программах Excel и Mathcad вычислить значение 1 + 10 –15, то получим ноль, а значение выражения 1 + 10–14 будет равно 1,00000000000001. Это число содержит 15 значащих цифр. Предельной относительной погрешностью представления числа с плавающей точкой в программах Excel и Mathcad можно считать 10 –14.
Относительная погрешность представления чисел с плавающей точкой («машинное эпсилон») определяется как наименьшее положительное число ε, при сложении которого с единицей получается отличное от единицы число. Это значение зависит от количества знаков, которые можно записать в мантиссе числа.
Для приблизительной оценки значения относительной погрешности представления можно предложить следующий алгоритм:
1) ε = 1;
2) ε = ε /2;
3) Если 1 < 1 + ε, то переходим к 2), иначе — переходим к 4);
4) Выводим значение 2ε.
Вычислим по этому алгоритму в программе Excel значение ε. Для этого вводим в ячейке A1 значение 1, в ячейке A2 формулу = A1/2, а в ячейке B2 — формулу = 1 + A2. Выделим две ячейки A2:B2 и маркером заполнения протянем вниз до строки 50. В столбце B получим результаты сложения с единицей убывающих чисел из столбца A. В таблице 1.2 приведены последние пять строк вычисленных значений. Очевидно, что за предельную относительную погрешность можно принять значение ε = 7,1054310 –15, или, если округлить, ε ≈ 10 –14, и максимальное число значащих цифр в мантиссе составляет 15.
Табл.1.2
|
A |
B |
46 |
2,84217E–14 |
1,00000000000003000000 |
47 |
1,42109E–14 |
1,00000000000001000000 |
48 |
7,10543E–15 |
1,00000000000001000000 |
49 |
3,55271E–15 |
1,00000000000000000000 |
50 |
1,77636E–15 |
1,00000000000000000000 |
Создадим в программе Excel макрос — пользовательскую функцию для определения значения ε.
Выполним команду меню «Сервис — Макрос — Редактор Visual Basic»; в открывшемся окне выберем меню «Insert — Module» и введем описание функции:
Function epsilon()
eps = 1
2 eps = eps / 2
If 1 < 1 + eps Then GoTo 2
epsilon = eps
End Function
На рис. 1.2 показано окно Редактора Visual Basic с введенным текстом программы.
Перейдем на лист Excel и введем в любой ячейке формулу = epsilon(), получим в этой ячейке значение
ε = 2,22045E-16 = 0,000 000 000 000 000 222045.
Отличие полученного значения ε = 2,22045E-16 от значения ε = 7,1054310 –15 из таблицы 1.2 объясняется особенностями вывода значений в ячейки программы Excel. При выводе числовых значений в форме с фиксированной запятой количество значащих цифр равно 15, остальные цифры отбрасываются.
Применим алгоритм вычисления «машинного эпсилон» в системе программирования Mathcad. Однако, здесь нас ждут интересные особенности. Введем в Mathcad следующую программу:
Мы видим, что число x = 9,09494701772928∙10 –13 в неравенстве 1 < x + 1 программа Mathcad принимает за ноль, но если мы выполним сложение 1 + 9,09494701772928∙10 –13, то получим 1,00000000000091. Это означает, что в неравенствах в программе Mathcad относительная погрешность составляет 10 –12. Интересно, что в программе Excel и в неравенствах та же относительная погрешность 10 –14, что и в представлении числа с плавающей точкой. Чтобы проверить это в любой ячейке листа Excel введем неравенство в виде формулы =1+10^–14>1. Значение будет равно «ИСТИНА». А если ввести формулу =1+10^–15>1, то получим значение «ЛОЖЬ». Обращаем здесь внимание на то, что в выражении 10^–15 не обязательно брать в скобки показатель степени –15.
Вычислим «машинное эпсилон» для языка программирования Borland C++ (версия 5.02). Для этого составим следующую программу:
#include <stdio.h>
int main(){
float eps2,eps = 1,x = 1,y;
do{
eps = eps/2; y = x + eps;
}while (x < y); eps2 = 2* eps;
printf("\neps = %e:", eps2);
return 0;
}
В результате выполнения программы получим eps = 1.192093e–07. Это значение совпадает с числом FLT_EPSILON = 1.192093e–07, приведенным в таблице 1.1 (Минимально возможное значение переменной типа float, такое, что 1.0 + FLT_EPSILON ≠ 1.0). Если в этой программе мы заменим тип float на тип double, то получим значение eps = 2.220446e–16, которое совпадает с константой DBL_EPSILON.
Задания для самостоятельной работы
1. Ток протекает по резистору 10 ом,
сопротивление задано с точностью
10%. Ток равен
.
Согласно закону Ома, падение напряжения
на резисторе равно произведению тока
на сопротивление. Какова относительная
и абсолютная ошибки вычисленного
значения напряжения? Ошибками округления
пренебречь.
2. Средняя длина авиалинии от Нью-Йорка до Сан-Франциско равняется 2700 милям, но может быть на 200 миль короче или длиннее в результате вариаций маршрута самолета. Средняя скорость самолета на этой линии составляет 580 миль в час, но может оказаться на 60 миль в час больше или меньше из-за ветра. Каковы верхний и нижний пределы времени полета?
3. Реактивное сопротивление емкости
дается формулой
,
где
— реактивное сопротивление емкости в
Омах,
— частота в герцах,
— емкость в фарадах. Указать границы
возможных значений
для
и
4. Положение
свободно
падающего тела в вакууме дается формулой
,
где
— ускорение свободного падения в
,
— время, прошедшее с начала падения в
.
Предположим, что
точно, но время может быть измерено
с точностью до 0,1 сек. Покажите, что
с ростом
абсолютная ошибка вычисленного значения
увеличивается, но относительная ошибка
— уменьшается.
5. Вычислить значение функции u и ее предельные абсолютную и относительную погрешности, если известны погрешности ее аргументов. Найти количество верных значащих цифр функции u (в широком и узком смысле). Параметры m и n заданы точно. Данные брать из табл.1.3.
Таблица 1.3.
№ |
u |
x |
y |
m |
k |
1) |
m sin(x+ ky) |
3,15 0,02 |
1,15 5% |
2 |
1,5 |
2) |
m sinx + cos(1+ ky) |
1,25 0,002 |
1,26 10% |
3 |
1,6 |
3) |
x m + y k |
1,23 0,02 |
1,58 5% |
4 |
1,7 |
4) |
sin(x – m) + cosky |
1,12 0,01 |
1,28 2% |
5 |
1,8 |
5) |
(x m + y k) – 1 |
1,32 0,01 |
1,97 2% |
6 |
1,9 |
6) |
ln(mx + ky) |
3,56 0,04 |
2,56 2% |
7 |
2,1 |
7) |
mx2 + ky2 |
1,84 0,04 |
6,21 2% |
8 |
2,2 |
8) |
log2(mx + ky) |
5,12 0,02 |
1,01 2% |
9 |
2,3 |
9) |
(x 2 – m + ky – 2) |
3,44 0,02 |
1,21 3% |
8 |
2,4 |
10) |
cos(mx + ky) |
4,11 0,02 |
1,06 4% |
7 |
2,5 |
11) |
m e x + k e – y |
1,32 0,02 |
1,12 5% |
6 |
2,7 |
12) |
e mx + ky |
2,12 0,02 |
1,52 6% |
5 |
2,9 |
13) |
cos(xm + ky) |
2,11 0,02 |
1,1 10% |
4 |
2,5 |
14) |
3 mx + 2 ky |
1,54 0,002 |
1,5 8% |
3 |
2,6 |
15) |
m(x2 + ky2) |
1,12 0,02 |
1,6 2% |
2 |
2,7 |
16) |
3 mx ∙ 2 ky |
1,22 0,02 |
1,9 2% |
9 |
2,8 |
17) |
tg(mx – ky) |
0,42 0,02 |
0,14 2% |
2 |
0,2 |
18) |
lg(mx – ky) |
1,45 0,002 |
1,5 2% |
2 |
0,1 |
19) |
m x + k e – y |
1,22 0,02 |
0,1 1% |
6 |
3,5 |
20) |
m e x + k – y |
0,52 0,004 |
2 5% |
5 |
3,4 |
6. Опытным путем определить наименьшее значение с плавающей точкой, наибольшее значение и относительную погрешность представления числа для программы Калькулятор в Windows.