Сумма ряда с заданной точностью

Требует вычислить ряд с заданной точностью: x - x^3/3 + x^5/5 - x^7/7 + ... Программа вычисляет ряд только до первого слагаемого, в чем ошибка и как можно было бы ускорить программу ?

#include <stdio.h>
#include <stdlib.h>
int factorial(int n) {
    if (n == 0)
        return 1;
    if (n > 0)
        return factorial(n - 1) * n;
}
long long deg(int n, double k) {
    if (n == 0)
        return 1;
    else
        return deg((n - 1), k) * k;
}
int main () {
    double eps;
    scanf ("%lf", &eps);
    double x, sum = 0.0, curr, prev;
    int k = 1, i = 0;
    scanf ("%lf", &x);
    curr =(deg(i,1) * deg(k,x)) / (double)k;
    prev = 0.0;
        while (abs(curr - prev) > eps) {
            if (i % 2 == 0)
                sum += curr;
            else
                sum -= curr;
            i++;
            k += 2;
            prev = curr;
            curr = (deg(i,1) * deg(k,x)) / (double)k;
        }
    printf ("%lf\n", sum); 
}

Ответы (1 шт):

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

У вас точно без факториалов? просто зачем-то в коде есть факториал, что наводит на размышления.

Если нет - то это делается примерно так:

int main()
{
    double x, eps;
    printf("Input x: ");
    scanf("%lf",&x);
    printf("Input eps: ");
    scanf("%lf",&eps);

    double term = x, sum = x;
    for(int k = 3; fabs(term) > eps*(k-2); k+=2)
        sum += (term *= -x*x)/k;
    printf("y = %lf, arctan(x) = %lf\n",sum,atan(x));
}

Арктангенс - потому что этот ряд сходится к нему...

Простите, но искать ошибку у вас - не имеет смысла, лучше писать программу сразу более корректно и эффективно.

→ Ссылка