Представление чисел в компьютере и погрешность

Так как для записи числа в компьютере выделяется ограниченная область памяти, то числовые значения ограничены. Границы значений зависят от типа числа и конкретной среды программирования или математического пакета. В таблице 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∙104932 < 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 следующую программу:

Представление чисел в компьютере и погрешность - student2.ru
Представление чисел в компьютере и погрешность - student2.ru

Мы видим, что число 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.

Наши рекомендации