![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Krjuger |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем это некое продолжение моей прошлой темы,только обрастающее новыми подробностями.
У меня дана функция x(expx-1).Я эту функцию раскладываю я ряд Тейлора и получаю сумма от 1 до N от xn+1/n!. Чтобы найти относительную погрешность мне надо а -n ый член разделить на сумму ряда,все это по модулю.Ну в общем то ,я думаю, вы и так понимаете как это делать.Суть заключается в том,у меня опять есть ограниченная разрядность мантисы и мне надо посмотреть как она будет влиять на результат.И как будет меняться N при которых мы будем выходить за граници возможностей нашей машины. Я немного абстрагировался от этой задачи.что я сделал, при помощи маткада я посчитал,при каком N будет достигаться относительная погрешность на грани машинного эпсилон 10-16,это N =24.Да забыл сказать,что точка в которой мы раскладываем ряд у меня дана.Это -2.3.Затем я высчитал значение этой погрешности она составила 8.602898672363349*10^-16.Дальше я посомтрел как оно себя будет вести при разрядах мантисы от 10 до 25,при фиксированных исходных данных.Для рязрядности с 10 до 16 я получил ожидаемый результат,но дальше начало твориться что то вообще непонятное.Ну или точнее я не могу понять, как это интерпретировать. ![]() Прикрепленные файлы ![]() |
![]() ![]() |
Krjuger |
![]()
Сообщение
#2
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Я наверно со совсем корректно написал то,что сделал.
Цитата Неверно. Надо проверять не на грани машинного эпсилон, а на грани эпсилон для твоего типа, мантисса которого содержит ограниченное число разрядов. Для m = 5 и m = 11 это будут разные значения, и нет смысла вычислять с точностью 10-16, если m = 5. Максимальная точность - только для максимальных длин мантиссы, и то не в типе float, а в long double. Соответственно, вычислять надо не N первых членов ряда, а пока очередной член не будет меньше Epsilon для типа. Да я это понимаю.Я их не сравнивал с машинной эпсилон. В общем,лень мое горе,напишу полностью,как есть информацию.Изначально у меня было 2 задачи 1 нужно было сделать в маткаде,а 2 на языке. Цитата Задача 1.2 Используя разложение заданной функции F(x) в ряд Тейлора в окрестности нуля, вычислить значения функции в двух точках x1и x2. Вычисление частичных сумм ряда производить до тех пор, пока отношение прибавляемого члена к частичной сумме не станет меньше машинного эпсилон.. ПОРЯДОК РЕШЕНИЯ ЗАДАЧИ: 1. Разложить заданную функцию F(x) в ряд Тейлора в окрестности нуля. 2. Выписать величину относительной погрешности, вычисляя ее как отношение прибавляемого члена к накопленной частичной сумме , взятое по модулю. 3. Определить количество членов ряда , при котором величина относительной погрешности станет меньше машинного эпсилон. Это я сделал сдал и бог бы с ним.В маткаде было выставлено считать до 16 цифр,результат я показал ранее. Цитата Задача 1.4. Составить программу на алгоритмическом языке, моделирующую вычисления на ЭВМ с ограниченной разрядностью m. Решить задачу 1.2 , используя эту программу. Составить график зависимости относительной погрешности от количества разрядов m= 4,5,…8. Вот собственно то,что я пытаюсь сотворить. Я немного отошел от задания,а именно сделал проверку при мантисе не 4,5,…8,а 10-25,чтобы посмотреть поведение.В моей голове уложилось такое мнение,что если мантиса имеет n чисел,то для этой мантисы машинное эпсилон будет равно 10-n,Так же я понимаю,что существует машинная эпсилон для тех стантартных типов данных,что есть я языке.В маткаде при 16 цифрах,я получал результат 8.602898672363349*10^-16,что вполне логично,это было границей точности,так как следующее число было уже 10-17,что выходит за рамки.Все это действо получалось при суммировании 24 членов ряда.Я думаю вполне логично,что при мантисе от 10 до 25 где нить должно будет появиться это число.Когда я выставляю мантису 16 и суммирую 24 раза я получаю вполне ожидаемый результат 8.602898672363349*10^-16 превращается в 9*10^-16,что вполне логично.Эта логика сохраняется до мантисы в 19.Происходить просто увеличение на 1 цифру точности числа,при 19 я получаю 8.603*10^-16,но при 20 происходит ,то чего я не ожидал.Вместо улучшения еще на 1 цифру я получаю совершенно другие результаты.Я пробовал менять double на long double,думая,что упираюсь в его точность,но меня ждал,сурприз,ни в одном тесте цифры не изменились. Тип float я в своей программе нигде и не использовал.Собственно,вопросы которыми я задаюсь следующие.Почему фигня начинается при мантисе 19,а не после 16,я спрашивал у преподавателя,он что то невнятное сказал,про то ,что когда сопроцессор считает,он использует расширенную точность,меня это как то невоодушевило,слишком расплывчато. В ваш код я очень старался вникнуть,но увы,с адой мое знакомство нулевое,так что я понял достаточно мало.Единственное я понял,что вы высчитывали факториал и слешующий элемент последовательности. Я не понял почему вы вызывали для мантисы 5 type MyFloat_05 is new Float digits 1; И в результате получали Last item : 1.6E-01,тобиш 0.16,вроде как мантиса 5 должна упереться в 10-5,либо я уже совсем ничего не понимаю.Кстати вы уж извините,но я руками посчитал несколько первых цленов ряда,и с вашими цифрами они никак не совпадают. Так что я прошу прокоментировать ваш код,ну или сделать небольшой вброс теории, которой вы руководствовались.Ну и если я где то что то смутно написал,то спросить,чтобы я прямо ответил. Да я забыл сказать,Для второй точки там число суммирований членов ряда при 16 получается около 70,так что я не стал реализовывать факториал рекурсивно,такая махина ни в один стандартный тип не влезет,использовать длинную арифметику тоже не стал,на мой взгляд не стоит овчинка выделки,да и как сделать это не знаю,не сталкивался,так что я поступил следующим образом,переходя в цикле на очередной член ряда я его в цикле делил на число от 2 до номера текущего члена ряда,и каждый раз при делении укорачивал подстраиваясь под мантису.Может это создаст еще некоторую погрешность,но мне легче обосновать преподавателю эту вынужденную погрешность,чем избавиться от нее. Сообщение отредактировано: Krjuger - 15.04.2011 17:11 |
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 14:29 |