1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
В общем это некое продолжение моей прошлой темы,только обрастающее новыми подробностями. У меня дана функция 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 я получил ожидаемый результат,но дальше начало твориться что то вообще непонятное.Ну или точнее я не могу понять, как это интерпретировать. Файл с самой программой тоже прикрепляю.
Что-то тема заскучала... Давай сделаем вброс небольшой.
1)
Цитата
что я сделал, при помощи маткада я посчитал,при каком N будет достигаться относительная погрешность на грани машинного эпсилон 10-16,это N =24.
Неверно. Надо проверять не на грани машинного эпсилон, а на грани эпсилон для твоего типа, мантисса которого содержит ограниченное число разрядов. Для m = 5 и m = 11 это будут разные значения, и нет смысла вычислять с точностью 10-16, если m = 5. Максимальная точность - только для максимальных длин мантиссы, и то не в типе float, а в long double. Соответственно, вычислять надо не N первых членов ряда, а пока очередной член не будет меньше Epsilon для типа.
2)
Цитата
Дальше я посомтрел как оно себя будет вести при разрядах мантисы от 10 до 25,при фиксированных исходных данных.
На всех значениях от 10 до 25 посмотреть не могу, а вот для M = 5, M = 8 и M = 11 - проверил. Извиняй, в Сях нет соответствующих средств, поэтому проверил там, где есть:
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
generic type Float_Type is digits <>; procedure Check(X : Float_Type);
procedure Check(X : Float_Type) is s, nom, nxt, last : Float_Type; n, denom : Long_Long_Integer := 1; begin Ada.Text_IO.Put_Line ("Mantissa : " & Integer'Image (Float_Type'Mantissa)); Ada.Text_IO.Put_Line ("Epsilon : " & Float'Image (Float_Type'Epsilon));
s := 0.0; nom := X * X; loop nxt := nom / Float_Type (denom); Ada.Text_IO.Put_Line ("nxt = " & Float_Type'Image(nxt) & " n! = " & Long_Long_Integer'Image(denom)); exit when abs(nxt) < Float_Type'Epsilon; s := s + nxt; nom := nom * X; n := n + 1; denom := denom * n; last := nxt; end loop; Ada.Text_IO.Put_Line ("Last item : " & Float_Type'Image(last)); Ada.Text_IO.Put_Line ("S : " & Float_Type'Image(s)); Ada.Text_IO.Put_Line ("N : " & Long_Long_Integer'Image(n));