Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Автор FAQ
3148 / 368 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
1

Почему при изменении условия цикла ничего не меняется?

06.10.2011, 19:29. Показов 872. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся с одним непонятным явлением в цикле. Для описания этого явления написал простенькую программку.
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
 
int main(){
    double i;
    for(i=0; i<=3; i+=0.1)
        printf("\nSqr(%lg)=%lg", i, i*i);
    getch();
    return 0;
}
В цикле условие i<=3 меняем на i<3. Но результат программы никак не меняется! Программа все так же выводит квадраты чисел от 0 до 2.9. Почему смена нестрогого условия на строгое никак не отражается на результате?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2011, 19:29
Ответы с готовыми решениями:

Почему при изменении размера окна не меняется цвет заполнения?
Почему при изменении размера окна не меняется цвет заполнения?:no: ... case WM_PAINT:...

Почему меняется MD5-хэш файла при каждой компиляции, хотя вроде бы ничего не поменялось?
Если компилятор игнорирует комментарии в коде, да и вообще ему (вроде) должно быть пофиг стоит у...

При решении блоком Given/Find не меняется результат при изменении приближенных значений
Здравствуйте! При решении задания по ТОЭ возникла необходимость использования блока Given/Find, но...

Не меняется дата при изменении времени
tz_database tzDB; tzDB.load_from_file(&quot;C:/date_time_zonespec.csv&quot;); std::string ms =...

4
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
06.10.2011, 20:04 2
RNT, почитай про представление чисел в машине. Эта тема, кстати, уже тут где-то обсуждалась.
Вообще, если бы ты захотел, то в дебагере бы увидел, чему равен i на последней итерации.

Добавлено через 2 минуты
О, нашел, как пример. Евгений уже запостил пост на эту тему. Вот темка, пятый пункт:
Неочевидные ответы на простые вопросы
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
06.10.2011, 20:08 3
патамучто
числа с плавающей запятой не так просто сравнивать
i+=0.1 не гарантирует что будет прибавляться одна десятая после округления вполне может быть 0.0999...
теперь смотри
на одной из итераций 2.89
и
Цитата Сообщение от RNT Посмотреть сообщение
i<=3 меняем на i<3
и то и другое условие будет иметь одно и тоже действие
посему в циклах используют целочисенное
например так
C++
1
2
3
4
5
6
 double i;
        for(int j=0; j<=30; j++)
    {
       i=(double)j/10.0;
        printf("\nSqr(%lg)=%lg", i, i*i);
  }
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.10.2011, 20:12 4
Дискретная математика, однако :-)
Фокус в том, что значение 0.1 не представимо абсолютно точно в двоичном коде. По этой причине при последней итерации у тебя на самом деле i = 2.9000000000000012 - тут, сам понимаешь, будет ли условие четко < 3, или <= 3 - всяко цикл завершится.

А вот если заголовок цикла записать так: for(i=0; i<3; i+=0.125) - значение 0.125 точно представимо в двоичном коде - то получишь как раз тот эффект, что и ожидаешь.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
06.10.2011, 20:28 5
целочисленное решение
C++
1
2
3
4
5
6
int main(){
      for(int i=0; i<=30; i++)
        printf("\nSqr(%lg)=%lg",double( i/10.0),double(( i*i)/100.0));
        getch();
    return 0;
}
Добавлено через 6 минут
можно еще так выпендрится но только в учебных целях
(хотя не знаю проканает ли проверять лень)
C++
1
2
3
4
5
6
7
int main(){
        double i,j=3.0;
        for(i=0; i<=j; i+=0.1)
        printf("\nSqr(%lg)=%lg", i, i*i);
        getch();
    return 0;
}
1
06.10.2011, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2011, 20:28
Помогаю со студенческими работами здесь

DataViewRowState не меняется при изменении в DataGrid
Есть DataGrid соединенный с DataSet, при изменении значения в ячейке запускается цикл, который по...

При изменении DataTable не меняется RowState
Здравствуйте, уважаемые! Столкнулась с такой странностью... Через Binding привязываю данные из...

Меняется стиль при изменении класса
Как же весело находить различные баги в своем коде... У нас есть HTML footer`а вместе с bootstrap...

Размер контейнера не меняется при изменении итератора
Почему размер контейнера не меняется? std::string m; std::string::iterator mi = m.begin(); *mi...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru