Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2010, 20:15   #1
Kushtemo
Новичок
Джуниор
 
Регистрация: 27.08.2010
Сообщений: 2
По умолчанию как работает счетчик в цикле for?

Здрасьте! Я совсем чайник, изучаю уроки по С++ на сайте programmersclub.ru. Попалась такая программка:

Код:

#include <iostream.h>

void main(void)


{
	float value;
		for(value=0.0;value<=1.0;value+=0.1)
		cout<<value<<' ';
	cout<<endl;
}
Буду очень признательна тому, кто четко и понятно объяснит тупому чайнику, почему программа выводит числа
0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9,
но не выводит 1? Ведь условие value<=1.0 выполняется?
Kushtemo вне форума Ответить с цитированием
Старый 27.08.2010, 20:58   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,089
По умолчанию

Тут работа с числами с плавающей запятой. Особенность этих чисел - потеря точности. Скорее всего, получается в итоге число вида: 1.0000000000001, а оно больше, чем 1.0. Вообще нельзя числа типа float/double сравнивать нестрогим неравенством. Чтобы сравнить два вещественных числа на равенство, нужно делать поправку на погрешность расчетов.
pu4koff вне форума Ответить с цитированием
Старый 27.08.2010, 21:03   #3
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Попробуй выделить тело цыкла

Код:
 for(value=0.0;value<=1.1;value+=0.1)
		{cout<<value<<' ';}
всему свое время как зиме и весне
и каждому солнцу свой неба кусок

Последний раз редактировалось Assemblerru; 27.08.2010 в 21:14.
Assemblerru вне форума Ответить с цитированием
Старый 27.08.2010, 21:18   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Классический пример бесконечного цикла:
Код:
for(double x = 0.0; x != 1.0; x += 0.2)
      cout<<x<<" ";
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 27.08.2010, 21:19   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
for(int i = 0; i <= 10; i++) 
{
    cout<<(i / 10.0f)<<' ';
}
BOBAH13 вне форума Ответить с цитированием
Старый 27.08.2010, 21:37   #6
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Тут работа с числами с плавающей запятой. Особенность этих чисел - потеря точности. Скорее всего, получается в итоге число вида: 1.0000000000001, а оно больше, чем 1.0. Вообще нельзя числа типа float/double сравнивать нестрогим неравенством. Чтобы сравнить два вещественных числа на равенство, нужно делать поправку на погрешность расчетов.
в таком случае можно попробовать в цикле поставить вместо 1.0 что-нибудь вроде 1.001 и посмотреть что будет
sashonk вне форума Ответить с цитированием
Старый 28.08.2010, 07:42   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Или я бы тогда даже так сделал:
Код:
for (int i = 0; i <= 10; i++)
   cout << 0.1 * i << " ";
Умножение оно как-то мне роднее в таких ситуациях, чем деление.
Ну а если обращаться все-таки к числам с плавающей точкой, то есть такая функция как epsilon - наименьшее число, такое что 1 + epsilon - 1 больше нуля. Находится она в шаблоне numeric_limits, соответственно, возвращает epsilon для того типа, который задан в качестве аргумента. На примере это выглядит так:
Код:
for (float x = 0.0; x - 1.0 < std::numeric_limits<float>::epsilon(); x += 0.1)
   std::cout << x << " ";
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 28.08.2010, 14:35   #8
Kushtemo
Новичок
Джуниор
 
Регистрация: 27.08.2010
Сообщений: 2
По умолчанию

Спасибо всем, кто ответил)
Вместо 1.0 поставила 1.01, помогло, теперь 1 выводится. Так что, видимо дело в погрешности было.

Я абсолютный чайник, извините, не могу пока понять половину ответов. Но все равно спасибо, что потратили на меня свое время))
Kushtemo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает счетчик zexxer Общие вопросы Delphi 2 26.05.2010 10:16
Как называется автономный USB счетчик информации? Izhic Компьютерное железо 5 06.01.2010 20:14
счетчик в цикле изменяется не от 0 до 4 а от 4 до 0 Ntlegend Общие вопросы Delphi 17 02.11.2009 00:59
Как вывести в цикле for ... do строки? ViTYAi2007 Помощь студентам 14 27.03.2008 05:47
как выбрать значения в цикле в паскале Melok Помощь студентам 5 14.12.2007 10:46