Как исправить код на c++ для подсчета бесконечной суммы с определенной точностью
я писала код на c++ для задания по подсчету бесконечной суммы. Действие программы прерывается, когда количество знаков после запятой становилось больше заданной точности. Но во время тестировки программы при x=1 и eps(ограничения)=0.1, программа выдала, что сумма=1, хотя должна была ровняться 0.8333. Вот сам код:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x;
long double eps;
cout << "x = ";
cin >> x;
cout << endl << "Accuracy = ";
cin >> eps;
double s = 0;
for (int n = 0; ; n++) {
double prom;
prom = pow(-1, n) * (pow(x, (2 * n + 1)));
for (int f = (2 * n + 1); abs(prom)> eps; f--) {
prom = prom / f;
}
if ((abs(prom) / 10) < eps) {
break;
}
else {
s = s + prom;
}
}
cout << endl << "Sum = " << s;
return 0;
}
Как это исправить? Заранее спасибо
Ответы (1 шт):
У вас неправильно считается текущий член ряда.
Пусть ряд an=(-1)^n*x^(2n+1)/(2n+1)
Рассмотрим как выразить следующий член ряда через предыдущий an+1=(-1)^(n+1)x^(2n+3)/(2n+3)=-(-1)^nx^(2n+1)/(2n+1)x^2(2n+1)/(2n+3)=-an**x^2*(2n+1)/(2n+3)
Получили рекуррентное соотношение. Использование pow приведет к резкому падению точности.
Далее. Ряд сходится при |x|<=1
Алгоритм Нужно запоминать предыдущее и следующее значения членов ряда. Как только модуль разности между ними станет меньше требуемой точности, то закончили.
#include<iostream>
#include <math.h>
using namespace std;
int main() {
// your code goes here
float eps=0.001;
int n=0;
float x=0.5;
float a0=x,a1=0,an,s=x;
while(fabs(a0-a1)>eps){
an=-a0*x*x*(2*n+1)/(2*n+3);
a1=a0;
a0=an;
n++;
s=s+an;
}
cout << s<< endl;
}
Ввод и вывод вы легко исправите как вам надо.