C/C++

Помогите с решением задачи на языке СИ

Пишу код. Код работает, но считает неккоректно. Незнаю почему.

Сам код:

#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);

}
Я Я
Я Я
583
x / 2 - это деление нацело
если x == 4 то x / 2 == 2
если x == 5 то x / 2 == 2
а чтобы получить 2.5, надо делать x / 2.0
аналогично для остального деления
Наталья Гаврилова
Наталья Гаврилова
38 458
Лучший ответ
Сергей Иванов x - double. double/int = double
Даже не глядя на Ваш код могу сразу сказать, что конечно всё будет считаться некорректно, когда в самом задании грубая ошибка! Вот откуда, спрашивается, взялось слагаемое ⅓•(х/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 пойдут некие искажения а то и зависания, но это уж недостаток самой аппроксимации исходной функции такого рода рядом, а не дефект программы...