Другие языки программирования и технологии

Почему в примере не совпадает получаемые значения. С++

Суть такова, что у меня в есть два примера S и С, при их вычислении я оба ответа должны совпадать с точностью до указанного при вводе знака, но как вы поняли они не совпадают, можете проверить и найди где-то ошибку в коде, пожалуйста. Если нужны уточнения спрашивайте.

Сам код:

#include
#include
#include
#include

using namespace std;

int main() {
double x, e, n;
string conexit = "continue", conexit1;
setlocale(LC_ALL, "Russian");

do {
a: cout << "Введите значение х : ";
cin >> x;
if ((x <= 0) || (x >= 1))
goto a;

b: cout << "Введите желаемую точность : ";
cin >> e;
if ((e <= 0) || (e >= 1))
goto b;

d: cout << "Введите необходимое число членов разложения n : ";
cin >> n;
if (n < 0)
goto d;

double s = 0, up, down, result, stepen;
int k = 1, koef, pum, fakt;
stepen = (x*x);
koef = 1;
pum = (2 * k * k + 1);
fakt = (1 * 2);

fakt = (fakt*(2 * k * k + 1)*(2 * k));

up = pum * stepen;
down = fakt;
result = koef * (up / down);

for (k = 2; abs(result) >= e; k++) {
s += result;

stepen *= stepen;
koef *= -1;
pum = (2 * k * k + 1);
fakt = (fakt*(2 * k * k+ 1)*(2 * k));

up = pum * stepen;
down = fakt;
result = koef * (up / down);
}

cout << "Сумма ряда S равна : " << s << endl;

k = 1;
double s2 = 0, up1, down1, result1, stepen1, fakt1;
int koef1, pum1;
stepen1 = (x*x);
koef1 = 1;
pum1 = (2 * k * k + 1);
fakt1 = (1 * 2);

fakt = (fakt*(2 * k * k + 1)*(2 * k));

up1 = pum1 * stepen1;
down1 = fakt1;
result1 = koef1 * (up1 / down1);

for (k = 2; k <= n; k++) {
s2 += result1;

stepen1 *= stepen1;
koef1 *= -1;
pum1 = (2 * k * k + 1);
fakt1 = (fakt1*(2 * k * k + 1)*(2 * k));

up1 = pum1 * stepen1;
down1 = fakt1;
result1 = koef1 * (up1 / down1);
}

double c;
c = (1 + (x / 2) * sin(x) + (((x * x)/2) - 1) * cos(x));
cout << "Результат контрольного выражения C равен : " << c << endl;

cout << "Для повтора вычислений введите continue ,";
cout << " для выхода - любую другую фразу или букву/цифру : ";
cin >> conexit1;
} while (conexit1 == conexit);

return 0;
}
// x -> переменная вещественного типа
// e -> переменная целого типа, означает количество знаков после разделителя
// n -> переменная целого типа, означает количество членов ряда
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;
bool forbidden(const double x) {
return x <= 0 || x >= 1;
}
bool forbidden(const unsigned x) {
return x < 0;
}
double fact(unsigned x) {
auto m = 1.0;
for (auto i = 1U; i <= x; ++i) m *= i;
return m;
}
double fs(const double x, const unsigned n) {
auto s = 0.0;
unsigned j, k;
double ds;
for (auto i = 1U; i <= n; ++i) {
j = 2 * i;
k = i * i * 2 + 1;
ds = k * pow(x, j) / fact(j);
s += i & 1? ds : -ds;
}
return s;
}
double fc(const double x) {
return 1 + x / 2 * sin(x) + (x * x / 2 - 1) * cos(x);
}
int main() {
double x;
unsigned e, n;
do {
system("cls");
do {
cout << "x: ";
cin >> x;
} while (forbidden(x));
do {
cout << "e: ";
cin >> e;
} while (forbidden(e));
do {
cout << "n: ";
cin >> n;
} while (forbidden(n));
auto s = fs(x, n);
auto c = fc(x);
cout
<< fixed << setprecision(e)
<< "s: " << s << "\nc: " << c
<< "\nTo exit, press the Escape key"
<< "\nTo continue, press any key\n";
} while (_getch() != 0x1B);
}
Александр Халупек
Александр Халупек
90 738
Лучший ответ
Роман Woolfon Великая Вам благодарность, вы меня уже не первый раз выручаете.
double x2 = - x * x, q = -1.0, s = 0.0, t;
long k = 0;
do {
++k;
q *= x2 / (2 * k * (2 * k - 1));
t = q * (2 * k * k + 1);
s += t;
} while (abs(t) >= e);
Роман Woolfon Я не могу разобраться куда его мне вставить, или где заменить?