Форум программистов, компьютерный форум CyberForum.ru

Почему зацикливается??? - C++

Восстановить пароль Регистрация
 
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 01:04     Почему зацикливается??? #1
Доброе время суток. Прошу объяснить или дать ссылку где такое описывается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main(){
    double const h=0.01;
    double x;
    x=2.0;
    do{
        cout<<x<<"\n";
        x+=h;
    } while (x!=3);
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
05.12.2010, 01:07     Почему зацикливается??? #2
float x никогда не будет точно равен трем. Это ошибка архитектуры 86 в работе с числами с плавающей запятой.
x>3 скорее всего пройдет.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.12.2010, 01:11     Почему зацикливается??? #3
lfin, Из-за представления дробных чисел в компьютере.

Добавлено через 1 минуту
Цитата Сообщение от lemegeton Посмотреть сообщение
x>3 скорее всего пройдет.
Меньше тогда уж.
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 01:19  [ТС]     Почему зацикливается??? #4
Спасибо большое!
А в таком случае что делать?
Даны две функции у1 и у2. распечатывать значения функции, пока не будет достигнуто пересечение графиков
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
using namespace std;
 
int main(){
    double const h=0.01;
    double x,y1,y2;
    x=2.0;
    do{
        y1=2*x*x*x-x*x+2;
        y2=2*exp(x/3);
        cout<<x<<"\t"<<y1<<"\t"<<y2<<"\n";
        x+=h;
    } while (y1=y2);
    return 0;
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
05.12.2010, 01:28     Почему зацикливается??? #5
Примерно тот же случай.
Для проверки на равенство, сравнивай разницу с некой точностью.
y1-y2 < 0.001, например.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
05.12.2010, 01:48     Почему зацикливается??? #6
Обычно принято сравнивать с 1E-6 - 1E-8, это считается приемлемой точностью.
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 01:50  [ТС]     Почему зацикливается??? #7
Программа выдает все равно не верный ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
using namespace std;
 
int main(){
    double const h=0.01;
    double x,y1,y2;
    x=2.0;
    do{
        y1=2*x*x*x-x*x+2;
        y2=2*exp(x/3);
        cout<<x<<"\t"<<y1<<"\t"<<y2<<"\n";
        x+=h;
    } while (abs(y1-y2)>1E-8);
    return 0;
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.12.2010, 01:53     Почему зацикливается??? #8
lfin, abs - для целочисленных, попробуйте fabs
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 01:57  [ТС]     Почему зацикливается??? #9
fasked, теперь опять зациклилось. значение второй функции намного больше становится. хотя я график строил, пересекаются функции.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.12.2010, 02:01     Почему зацикливается??? #10
попробуйте вывести значения на каждой итерации цикла, может что и прояснится
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 02:16  [ТС]     Почему зацикливается??? #11
fasked, из 8 строчки кода видно что x=2.0;

Добавлено через 12 минут
fasked, что может проясниться???? 100000 итереций и не известно сколько еще будет???
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.12.2010, 03:56     Почему зацикливается??? #12
Сразу ответ не скажу, но дам большу подсказку. Функции пересекаются при x = 30.7980679958266
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 12:56  [ТС]     Почему зацикливается??? #13
kazak, но это самая верхняя точка пересечения. Помимо ее есть еще 3 точки в которых пересекаются функции

Добавлено через 27 минут
kazak, а, все понял. Шаг слишком маленький
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.12.2010, 13:05     Почему зацикливается??? #14
Цитата Сообщение от lfin Посмотреть сообщение
Шаг слишком маленький
Слишком большой, у меня для точности 1Е-8 пришлось сделать шаг 1Е-12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 13:24     Почему зацикливается???
Еще ссылки по теме:

Почему программа себя странно ведет: зацикливается после ввода значений? C++
C++ Почему зацикливается программа?
Программа зацикливается. Почему? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lfin
2 / 2 / 0
Регистрация: 11.10.2009
Сообщений: 31
05.12.2010, 13:24  [ТС]     Почему зацикливается??? #15
kazak, ой конечно же большой))) я это и имел ввиду)
Yandex
Объявления
05.12.2010, 13:24     Почему зацикливается???
Ответ Создать тему
Опции темы

Текущее время: 08:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru