Сумма ряда с заданной точностью
Требует вычислить ряд с заданной точностью: 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));
}
Арктангенс - потому что этот ряд сходится к нему...
Простите, но искать ошибку у вас - не имеет смысла, лучше писать программу сразу более корректно и эффективно.