C/C++

Помогите пожалуйста написать программу на Си

помогите пожалуйста написать программу на си
/*
программа работает только для x в диапазоне от -4 до 4 (не включительно),
иначе получается бесконечный цикл
*/

#include <stdio.h>
double my_fabs(double x)
{
return x >= 0.0 ? x : -x;
}
double my_pow(double x, int y)
{
return y > 0 ? x*my_pow(x,y-1) : y < 0 ? 1.0 / (x*my_pow(x,-y+1)) : 1.0;
}
int my_fact(int x)
{
return x > 0 ? x*my_fact(x-1) : 1;
}
int main()
{
double eps,dx,x,y = 0.0;
printf("eps: ");
scanf("%lf",&eps);
printf("x: ");
scanf("%lf",&x);
int n = 0;
do
{
dx = my_pow(-1.0,n) * my_pow(x,2*n) / (double) my_fact(2*n);
y += dx;
n++;
}while(my_fabs(dx) >= my_fabs(eps));
printf("%lf\n",y);
return 0;
}
Sky Net
Sky Net
83 431
Лучший ответ
Жахан Абу Абдуррохман А возможно через for сделать?
double x, eps, q, t = 1.0, s = 1.0;
int n = 0;
scanf("%lf%lf", &x, &eps);
q = -x * x;
do {
n += 2;
t *= q / (n * (n - 1));
s += t;
} while (fabs(t) >= eps);
printf("%lf", s);

P.S. Банальная рекуррентная формула:
t[0] = 1
t[i] = t[i - 1] * -x * x / (2 * i * (2 * i - 1))

P.P.S. Через for:

double x, eps, q, t = 1.0, s = 1.0;
scanf("%lf%lf", &x, &eps);
q = -x * x;
for (int n = 2; fabs(t) >= eps; n += 2) {
t *= q / (n * (n - 1));
s += t;
}
printf("%lf", s);
ЭА
Эдем Алиев
95 740
Жахан Абу Абдуррохман А возможно через for сделать?
Так вот можно с контролем результатов:
#include <stdio.h>
#include <math.h>
int main()
{ const double tau = 6.2831853071795865;
double X, x, y, p, q, s, S, eps; for (;;)
{ printf("x eps: "); scanf("%lf%lf", &x, &eps);
S = cos(x); if (x < 0) x = -x;
x -= tau * (unsigned long long)(x / tau);
p = s = 1.; q = 0.; y = - x * x;
while (fabs(p) > eps) { q += 2.;
p *= y / (q * (q - 1.)); s += p; }
printf("%.17g %e\n", s, s - S); } }
А аргумент приводить к небольшим числам обязательно, иначе получится чушь в виде косинуса, по модулю бОльшего единицы, причём намного бОльшего. Да, и не всегда заказываемая точность будет меньше фактической.