вечный цикл на С
есть рекурентная последовательность:

первый член последовательности y_1 = a (a вводится с клавиатуры)
нужно найти первый член последовательности, для которого выполняется неравенство:

вот мой код:
int main()
{
setlocale(LC_ALL, "Russian");
double a ,x, E, difference;
printf("введите а: ");
scanf("%lf", &a);
printf("введите x: ");
scanf("%lf", &x);
printf("введите E: ");
scanf("%lf", &E);
double y_i = a, previous = y_i;
while(1) {
y_i = 0.5 * (previous + (x / previous));
difference = fabs(pow(y_i, 2) - pow(previous, 2));
if (difference < E) {
printf("первый член для которого difference меньше чем %lf = %lf", E, y_i);
break;
}
else {
previous = y_i;
printf("%lf \n", y_i);
continue;
}
}
return 0;
}
вопрос: для a = 10, x = 5, E = 0.1 получается вечный цикл(с определенного момента выводится только 2,236068), хотя в онлайн компиляторе такого не происходит и выводит правильный результат(первый член для которого difference меньше чем 0.100000 = 2.236070). почему так получается ? спасибо
Ответы (2 шт):
проблема тут
printf("введите а: ");
scanf("%lf", &a);
printf("введите x: ");
scanf("%lf", &x);
printf("введите E: ");
scanf("%lf", &E);
E считывается как 0
если сразу задать
double a = 10, x = 5, E = 0.1, difference;
то код отрабатывает без зацикливания
Вот ваша реальная проблема:
setlocale(LC_ALL, "Russian");
раз LC_ALL то и ввод с плавающей запятой требуется по-русски, т.е. 0,1, а не 0.1
Проблема в
setlocale(LC_ALL, "Russian");
Как только вы от него откажетесь, так сразу оно перестанет требовать вводить данные с запятой, а не с точкой :)
Или не отказывайтесь, но вводите 0.1 - как 0,1 - обратите внимание на запятую.