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 я получил ожидаемый результат,но дальше начало твориться что то вообще непонятное.Ну или точнее я не могу понять, как это интерпретировать. Файл с самой программой тоже прикрепляю.
long double Round(long double chislo, int n) { long double result; __int64 iChislo; double drob; int k=0; if (chislo<0) k=-1; else k=1; iChislo = (__int64) chislo; drob = chislo - iChislo; result=((__int64) (drob*pow(10.0,n)+k*0.5))/pow(10.0,n); result = iChislo + result; return result; }
long double Cut(long double value,int m) { int n=0; long double temp=abs(value); while (temp>=1) { temp=temp/10; n++; } value=Round(value,abs(m-n)); return value; }
long double Sum(long double num,int n,int m) { long double temp=0; long double tmp=0; for (int i=1;i<=n;i++) { tmp=pow(num,i+1); tmp=Cut(tmp,m); for (int j=2;j<=i;j++) { tmp=tmp/j; tmp=Cut(tmp,m); } temp+=tmp; temp=Cut(temp,m); } return temp; }
long double DeltaPogr (long double x,int n,int m) { long double temp=0.0; long double an=0.0; long double tmp=0.0; int p=0; int d=0; an=pow(x,n+1); for (int j=2;j<=n;j++) { an=an/j; } while (abs(an)>=1) { an/=10; p++; } an=Cut(an,m); an=an*pow(10.0,p); cout <<" a" << n << " elem: " << an; temp=abs(an/Sum(x,n,m)); temp=Cut(temp,m); cout <<" Pogr iz " << n << " elem:" << temp; tmp=abs(Sum(x,n,m)); while (tmp>=1) { tmp/=10; d++; } tmp=Cut(tmp,m); tmp=tmp*pow(10.0,d); cout << " Summa : " << tmp << endl; return temp; }
void main() { long double num=0.0; long double res=0.0; long double x1,x2; long double eps=0.0; long double temp=0.0; int m=0; int s=0; int N; x1=-2.3; x2=-17.0; for (int i=5;i<=8;i+=3) { cout << "Razryadnost* manticy:" << i << endl; N=0; m=0; s=0; eps=1/pow(2.0,i-1); temp=eps; while (temp<=1) { temp*=10; m++; } cout << "Epsilon:"<< eps << endl; do { s++; N++; res=DeltaPogr(x1,s,m); } while (abs(res)>=eps); cout << "Kol-vo chlenov ryada:" << N << endl; } }
Для точки x1 вроде правильно считает,но с выводом нечто неладное. Volvo,Вы раньше упоминали,что выводить надо с точностью до десятой,я не совсем понял при каких случаях.Например,nxt = -4.5E-02 ,что равно -0.045 при эпсилон 0.0625 при выводе правильно выводить -0.04 или все равно выводить -0.045?Просто как я не крутился,но ответ предстает в виде. Если я хочу вывести все таки -0.045,то тогда у меня у всех чисел начинают появляться по 1 цифре...
Следующий вопрос,можно ли как то принудительно заставить выводить через экспоненту,потому что для второго корня числа выводятся не очень красиво.
Ну и последний вопрос,можно ли все это как нибудь оптимизировать,потому,что я программе очень много повторяющегося кода,и слишком много на мой взгляд циклов,но как от них избавиться я не знаю.