Я наверно со совсем корректно написал то,что сделал.
Цитата
Неверно. Надо проверять не на грани машинного эпсилон, а на грани эпсилон для твоего типа, мантисса которого содержит ограниченное число разрядов. Для 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 до номера текущего члена ряда,и каждый раз при делении укорачивал подстраиваясь под мантису.Может это создаст еще некоторую погрешность,но мне легче обосновать преподавателю эту вынужденную погрешность,чем избавиться от нее.