Представление чисел в компьютере и погрешность
Так как для записи числа в компьютере выделяется ограниченная область памяти, то числовые значения ограничены. Границы значений зависят от типа числа и конкретной среды программирования или математического пакета. В таблице 1.1 представлены диапазоны значений чисел различных типов в языке программирования C.
Табл. 1.1
Тип | Размер памяти в байтах | Диапазон возможных значений |
short int | –32768 <= n <= 32767 | |
long int | –2147483648 <= n <= 2147483647 | |
unsigned short int | 0 <= n <= 65535 | |
unsigned long int | 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 | |
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 | |
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 | |
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,10543×10 –15, или, если округлить,
ε ≈ 10 –14, и максимальное число значащих цифр в мантиссе составляет 15.
Табл.1.2
A | B | |
2,84217E–14 | 1,00000000000003000000 | |
1,42109E–14 | 1,00000000000001000000 | |
7,10543E–15 | 1,00000000000001000000 | |
3,55271E–15 | 1,00000000000000000000 | |
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,10543×10 –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.