Не удаётся откорректировать программу

Долго ищу ошибку в коде, не могу найти. При проверке вычислений вручную обнаруживается ошибка (при расчёте выражение в модуле оказывается больше, чем введённое значение 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 шт):

Автор решения: Harry

Если не обращать внимание на разночтение в условии и в коде, то цикл

do {
    ...
 } while (fabs(pow(y2, 2) - pow(y1, 2)) < e); 

прекращает выполнение, когда не выполняется условие, т.е. когда разность по модулю больше или равна e. Что вряд ли то поведение, которое вам нужно...

→ Ссылка
Автор решения: Gry

После некоторого времени раздумий получилось.

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

}
→ Ссылка