Как исправить код на 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 шт):

Автор решения: becouse

У вас неправильно считается текущий член ряда.

Пусть ряд 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;

}

Ввод и вывод вы легко исправите как вам надо.

→ Ссылка