Не удаётся откорректировать программу
Долго ищу ошибку в коде, не могу найти. При проверке вычислений вручную обнаруживается ошибка (при расчёте выражение в модуле оказывается больше, чем введённое значение e.
Само задание:
Общий член последовательности вещественных чисел образуется по формуле:
y(i) = 1/2*(y(i-1) + x/y(i-1)-1), i= 1, 2,…,
Найти первый член y(n), для которого выполняется неравенство |y(n)^2 – y(n-1)^2| < e.
e и x вводятся с клавиатуры.
Вот сам код:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i = 1;
double x, e;
double y1, y2;
printf("Add x: ");
scanf_s("%lf", &x);
printf("Add e: ");
scanf_s("%lf", &e);
y1 = 1;
y2 = 0.5*(y1 + x / y1 - 1);
do {
y1 = y2;
y2 = 0.5 * (y1 + x / y1 - 1);
printf("%lf\n", fabs(pow(y2, 2) - pow(y1, 2)));
} while (fabs(pow(y2, 2) - pow(y1, 2)) < e);
printf("Result y2: %f\n", y2);
printf("Result y1: %f\n", y1);
printf("%lf\n", fabs(pow(y2, 2) - pow(y1, 2)));
}
Ответы (2 шт):
Если не обращать внимание на разночтение в условии и в коде, то цикл
do {
...
} while (fabs(pow(y2, 2) - pow(y1, 2)) < e);
прекращает выполнение, когда не выполняется условие, т.е. когда разность по модулю больше или равна e. Что вряд ли то поведение, которое вам нужно...
После некоторого времени раздумий получилось.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
double x, e;
double y1, y2;
printf("Add x: ");
scanf_s("%lf", &x);
printf("Add e: ");
scanf_s("%lf", &e);
printf("Add y1: ");
scanf_s("%lf", &y1);
y2 = 0.5 * (y1 + x / y1 - 1);
while (fabs(pow(y2, 2) - pow(y1, 2)) > e) {
y1 = y2;
y2 = 0.5 * (y1 + x / y1 - 1);
printf("%lf\n", fabs(pow(y2, 2) - pow(y1, 2)));
}
printf("Result y2 NEW: %lf\n", y2);
printf("%lf\n", fabs(pow(y2, 2) - pow(y1, 2)));
}