Все ненужные fact и pow надо убрать и запустить такой вот тестировочный код:
#include <iostream>
#include <cmath>
using namespace std;
double f(double x)
{
return pow(cos(x), 3);
}
double absolute(double x)
{
return x < 0 ? -x : x;
}
double s(double x)
{
double sum = 1., u = 0.75, v = 0.25, r,
q = 0., a = - x * x, b = 9. * a, e = 1e100;
while (absolute(e) > 1e-4)
{
q += 2.;
r = 1. / (q * (q - 1.));
u *= a * r;
v *= b * r;
e = u + v;
sum += e;
}
return sum;
}
int main()
{
double x, sx;
while (true)
{
cout << "x: ";
cin >> x;
sx = s(x);
cout << sx << ", error = " << sx - f(x) << endl;
}
}
Результаты его работы внизу на скрине. Сразу бросается в глаза, что при |x|≥10 программа не гарантирует требуемой точности, так как надо или аргумент по школьным формулам приведения уменьшать до минимума, или работать с рядом для косинуса, a потом возводить его в куб, а не с тем, который в задании и в котором вычисляется
cos³x=(3cos(x)+cos(3x))/4.
Протестировав эту программу, всё ненужное из неё выбрасываем и получаем вот что:
#include <iostream>
using namespace std;
double absolute(double x)
{ return x < 0 ? -x : x; }
double s(double x)
{ double sum = 1., u = 0.75, v = 0.25, r,
q = 0., a = - x * x, b = 9. * a, e = 1e100;
while (absolute(e) > 1e-4)
{ q += 2.; r = 1. / (q * (q - 1.)); u *= a * r;
v *= b * r; e = u + v; sum += e; } return sum; }
int main()
{ double x; while (true) { cout << "x: ";
cin >> x; cout << s(x) << endl; } }
