C/C++

Помогите с кодом C++

Не получается посчитать s. Результат для всех s получается 0(там надо посчитать с точностью до эпсилон, который равен 0.001. Что не так? Помогите пожалуйста.
Все ненужные 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; } }
Николай Тарак
Николай Тарак
66 572
Лучший ответ
Сергей Синанов а что за переменные u v r ?
Николай Тарак номер 0. А у переменных u, v и q (можно заменить его на n) начальные значение соответственно 0.75, 0.25 и 0. Потом на каждом шаге цикла к q прибавляется 2, u умножается на число -x²/(n•(n-1)), v умножается на -9х²/(n•(n-1)), е равно u+v, которое и прибавляется к предыдущей сумме. Цикл длится до тех пор, пока очередная прибавка к сумме sum по модулю не будет меньше 1е-4. И никаких лишних pow и fact здесь точно не требуется!
1/4 можно сразу заменить на 0.25 хотя оптимизатор по идее это сделает за вас, но все же И это 1/4 надо умножать в самом конце, а не каждый раз в цикле. Да и код тут не весь и додумывать, что еще у вас трудно. Давайте ссылки на ideone.com
Сергей Синанов #include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

double y(double &x);
double s(double &x);
int fact(int n);

int main()
{
double a = -1.5, b = 1.5, h = 0.3;
for (double x = a; x < b; x += h)
{
cout << "x = " << x << setw(12) << "y = " << y(x) << setw(12) << "s = " << s(x) << endl;
}
}

double y(double &x)
{
double res_y = pow(cos(x), 3);
return res_y;
}

double s(double &x)
{
double eps = 0.001;
double s;
double res_s = 0.0;
int n = 0;
while (res_s > eps)
{
s = 0.25 * (pow(-1, n) * (3 + pow(9, n)) * pow(x, 2 * n) / fact(n));
res_s += s;
n++;
}
return res_s;
}

int fact(int n)
{
int res_fact = 1;
for (int i = 1; i < n; i++)
{
res_fact *= 2 * n;
}
return res_fact;
}
Сергей Синанов извините, сайт ваш не грузит у меня