

Пишу код. Код работает, но считает неккоректно. Незнаю почему.
Сам код:
#include <stdio.h>
#include <math.h>
#include <locale.h>
#define MAX_ITER 1000.0
void main() {
double fx, x, Sn, S, eps, n;
setlocale(LC_ALL, "rus");
printf("Добро пожаловать в систему подсчета функций Максвелла! \n");
printf("Нажмите на [ENTER] для продолжения.");
getchar();
printf("Пожалуйста, введите значение x: ");
scanf_s("%lf", &x);
printf("пожалуйста, введите значение eps: ");
scanf_s("%lf", &eps);
fx = pow(8 - x * x * x, 8. / 3.);
Sn = 1;
S = Sn;
n = 0;
while (fabs(fx - S) > eps&& n < MAX_ITER) {
Sn *= (3 * n + 1) * ((x / 2) * (x / 2) * (x / 2)) / (3 * n + 3);
S += Sn;
n += 1;
}
printf("fx = %12.10lf\n", fx);
printf("S = %12.10lf\n", S);
printf("n = %1.0lf\n", n);
}
x / 2 - это деление нацело
если x == 4 то x / 2 == 2
если x == 5 то x / 2 == 2
а чтобы получить 2.5, надо делать x / 2.0
аналогично для остального деления
Даже не глядя на Ваш код могу сразу сказать, что конечно всё будет считаться некорректно, когда в самом задании грубая ошибка! Вот откуда, спрашивается, взялось слагаемое ⅓•(х/2)² если на самом деле должно быть ⅓•(х/2)³ ? Здесь надо было сначала аккуратно написать формулу разложения функции в ряд, а потом аккуратно записать инициацию и рекурренцию итерационного цикла, как ниже:
#include <cmath>
#include <iostream>
using namespace std;
double f(double x)
{
double y = pow(x * 0.5, 3) / 3., p = 1., q = p, s;
p *= y; s = p; while (fabs(p) > 1e-18)
{ q++; p *= (3. - 4. / q) * y; s += p; }
return 2. - 2. * s;
}
double F(double x) { return cbrt(8. - x * x * x); }
int main()
{
double x; cout.precision(17); for (;;)
{ cout << "x: "; cin >> x; cout << f(x)
<< '\n' << F(x) << endl; }
}
И то же самое можно сделать не с машинной точностью (как у меня), а с точностью вводимою с экрана. И всё будет работать замечательно. Только при приближении |x| к 2 пойдут некие искажения а то и зависания, но это уж недостаток самой аппроксимации исходной функции такого рода рядом, а не дефект программы...