КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Методические указания. Исследование погрешностей вычислений
Исследование погрешностей вычислений
Работая над решением задачи, всегда полезно знать правильный ответ Закон Мерфи Цель работы – исследование вычислительных погрешностей при использовании различных вещественных типов данных и получение практических навыков при программировании сугубо вычислительных алгоритмов. (4 час.) Как известно, любые вычисления, в нетривиальных случаях, можно выполнить только с некоторой точностью. Например, результатом операции 1.0/3.0 является 0 целых и бесконечное число "троек". В то же время выполнение операторов cout.precision(20); cout<<1./3.;
даст следующий результат: 0.33333333333333331482
Отметим, что для констант 1. и 3. в приведенном выше выражении компилятором выбран тип double по умолчанию, в связи с чем значащих цифр в полученном результате 16, а последние 4 цифры (1482) являются случайными (или псевдослучайными, строго говоря).
Выполнение же оператора cout<<(float)1./(float)3.;
дает такой результат 0.33333334326744079589
В этом случае явно заданы типы констант 1. и 3. посредством приведения типа, вследствие чего число значащих цифр и сокращается до 7. Еще один поучительный (или умопомрачительный?!) пример - это такой фрагмент программы: cout.precision(20); // выводить 20 значащих цифр cout<<0.5; // выводится 0.5 cout<<0.6; // выводится 0.59999999999999998 cout<<0.6f; // выводится 0.60000002384185791 cout<<0.5+1e-20; // выводится 0.5
Или другой пример – вывод значений от -1 до +1 с шагом 0.1 следующим образом (проверьте, что получится, но не забудьте оператор cout.precision(20);): for(double d=-1.0; d<=1.0; d+=0.1) cout<<d<<endl;
Не правда ли, интересные результаты? Может быть, прикладная математика действительно имеет право на существование, как и специалисты в этой области? Задание. В данной работе требуется реализовать вычисление числа Эйлера Е в степени X по формуле: n EX = 1+ ∑ (Xk / k!) (1) k=1
с максимально возможной точностью для двух вещественных типов: float и double. Как нетрудно видеть, искомый результат – E в степени X – получается путем суммирования членов ряда, причем с ростом k абсолютные значения членов ряда убывают, стремясь к нулю. Так как число значащих цифр для любого типа данных ограничено, то, начиная с некоторого k, прибавление очередного члена ряда уже не будет влиять на результат – EX. Если мы найдем такой член ряда, то по его величине мы и сможем судить о погрешности вычисления EX. Нахождение такого члена ряда для каждого из названных вещественных типов данных (float и double) и является Вашей благородной задачей, решив которую Вы прославите себя на века. Для того чтобы убедиться в корректности программы, необходимо вывести на монитор для каждого типа данных:
Проверьте корректность работы программы при нулевых, положительных, отрицательных и нецелых значениях X. Вычисление EX для каждого из вещественных типов данных удобно вынести в отдельную функцию. Программу можно оформить в виде консольного приложения. Для того чтобы с помощью потока cout выводить заданное число значащих цифр выражения вещественного типа, можно воспользоваться компонентной функцией precision() класса iostream precision(число_значащих_цифр)
следующим образом: cout.precision(20);
Для первоначальной проверки корректности вычислений напишите программу, которая будет вычислять EX при заданном n. Посмотрите, будет ли уточняться значение EX с ростом n. При X==1 значение EX должно быть равно приблизительно 2.718281. Можно воспользоваться также библиотечной функцией exp(), объявленной в заголовочном файле Math.h, для сравнения результатов своих вычислений с библиотечными. Если при вычислении какой-либо величины (вещественного типа) происходит выход за границу диапазона для данного типа, то состояние ошибки не возникает, а значение величины при выводе представляется как 1.#INF (сокращение от infinite – бесконечный). Это характерное значение можно (и нужно!) проконтролировать с помощью функции infinity(), которая в этом случае возвращает значение true. Например: float fact; // вычисления if(fact==numeric_limits<float>::infinity()) cout<<"Караул, переполнение!!!"<<endl;
Для типа double надо использовать функцию таким образом:
if(fact==numeric_limits<double>::infinity())cout<<"Ужас, переполнение!!!"<<endl;
Для использования функции infinity() надо подключить заголовочный файл: #include <limits>
Если Вам удастся разработать удачный алгоритм вычисления экспоненты, то Ваши результаты будут практически совпадать (до 15 значащих цифр) с библиотечной функцией. Например, для типа double можно получить такие результаты: X=709.75 Exp = 1.7398368732641691e+308 eps=7.8270482774736306e+291 n=938 Math::exp = 1.7398368732641605e+308 7. Поиск экстремумов с ограничениями или «Брачное агенство» Если отладка - процесс удаления ошибок, то программирование должно быть процессом их внесения Закон Мерфи Цель работы – освоить приемы поиска экстремальных значений в массивах структур при наличии дополнительных ограничений и условий (4 час.).
Дата добавления: 2014-12-26; Просмотров: 789; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |