C/C++

Помогите найти ошибку в коде

Условиt:
Не используя стандартные функции, вычислить с точностью eps > 0:
? = ?????(?) = ? − ? ^3/3 + ? ^5/5− ... +(−1)??^2?+1/(2? + 1)+ ...
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше
???, – все последующие слагаемые можно не учитывать.






#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);


double x, eps, sum;
scanf("%lf\n%lf", &x, &eps);

sum = x;
int d = 1, n = 1;
if (x > eps || x<-eps)
{
while ((x * x * x / (n + 2)) > eps || (x * x * x / (n + 2)) < -eps)
{
if (d % 2 != 0)
sum = sum - (x * x * x / (n + 2));
else
sum = sum + (x * x * x / (n + 2));
++d;
x = x * x * x;
n += 2;


}

if (d % 2 != 0)
sum = sum - (x * x * x / (n + 2));
else
sum = sum + (x * x * x / (n + 2));
}
printf("%0.5lf", sum);


return 0;

}
По моему лучше так:

#include <stdio.h>

double abso(double x) { return x < 0 ? - x : x; }

double arctg(double x, double eps)
{ double e = 1e303, y = - x * x, p = x, s = x,
q = 1.; while (abso(e) > eps) { q += 2.; p *= y;
e = p / q; s += e; } return s; }

int main() { double x, eps; while (true)
{ printf("x eps: "); scanf("%lf%lf", &x, &eps);
printf("arctg(x) =%20.16f\n", arctg(x, eps)); } }
Санди *******
Санди *******
66 572
Лучший ответ
Фигня какая-то. Отдельное слагаемое растет в экспоненте, и никогда не будет меньше eps по модулю. Возможно следует запоминать знакопеременную сумму и после каждой итерации проверять abs(summ_prev-summ)>eps. Тогда есть шанс)
ЗЫ: разумеется если x>1
Егор Курушкин
Егор Курушкин
51 416
Нашол
Влад Скрипник
Влад Скрипник
3 250
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);


double x, eps, sum;
scanf("%lf\n%lf", &x, &eps);

sum = x;
int d = 1, n = 1;
if (x > eps || x<-eps)
{
while ((x * x * x / (n + 2)) > eps || (x * x * x / (n + 2)) < -eps)
{
if (d % 2 != 0)
sum = sum - (x * x * x / (n + 2));
else
sum = sum + (x * x * x / (n - 2));
+-d;
x = x * x * x;
n += 5;


}

if (d % 2 != 0)
sum = sum - (x * x * x / (n + 3));
else
sum = sum + (x * x * x / (n + 2));
}
printf("%0.8lf", sum);


return 0;

}