Представление чисел в компьютере и погрешность
Так как для записи числа в компьютере выделяется ограниченная область памяти, то числовые значения ограничены. Границы значений зависят от типа числа и конкретной среды программирования или математического пакета. В таблице 1.1 представлены диапазоны значений чисел различных типов в языке программирования C. Табл. 1.1
Если при вычислениях для переменной типа float будет получено число с порядком меньшим чем –38, оно будет заменено нулем, а если порядок числа превысит 38, то произойдет так называемый «аварийный останов» (система прекратит выполнение программы пользователя) и выведено сообщение о переполнении порядка. Для переменной типа float число с порядком меньшим чем –38 является нулем, а число с порядком большим, чем 38 — бесконечностью. Для переменной типа double нулем являются значения с порядком меньшим чем –308, а бесконечностью — значения с порядком большим, чем 308. В таблице 1.2 приведены константы для чисел с плавающей точкой стандартной библиотеки языка программирования C. Табл. 1.2
В программах OpenOffice Calc, Microsoft Excel и Mathcad границы значений числа приблизительно соответствуют типу double языка C. Мантисса может содержать до 15 десятичных цифр. Например, число десятичных знаков числа с плавающей точкой в программе Excel можно найти очень простым способом: записать в ячейку формулу =1/3 и с помощью команды меню «формат ячейки» определить формат «числовой с 20 знаками после запятой». Мы увидим, что мантисса числа содержит 15 (значащих) десятичных цифр, остальные цифры равны нулю. Если в программах Excel и Mathcad вычислить значение Относительная погрешность представления чисел с плавающей точкой («машинное эпсилон») определяется как наименьшее положительное число ε, при сложении которого с единицей получается отличное от единицы число. Это значение зависит от количества знаков, которые можно записать в мантиссе числа. Для приблизительной оценки значения относительной погрешности представления можно предложить следующий алгоритм: 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, или, если округлить, Табл.1.2
Создадим в программе 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 в неравенстве Вычислим «машинное эпсилон» для языка программирования 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.
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1839)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |