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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
#1

Итерация - C++

30.06.2009, 12:44. Просмотров 2549. Ответов 6
Метки нет (Все метки)

Здравствуйте!

C++
1
2
3
4
for(i=0.1; i<=n; i+=0.1)
    {
         cout << i << " ";
    }
Например ввожу 2, а он зараза показывает до 1,9. Почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.06.2009, 12:54     Итерация #2
Потому что число 0.1, которое ты прибавляешь не может хранится в компьютере, как 0.1 ровно. Если я не ошибаюсь, это одно из таких чисел. Почитай про представление дробных чисел в памяти компа.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.06.2009, 13:12     Итерация #3
Предположительно,на последней итерации цикла число i превышает n,так как абсолютная погрешность (машинный эпсилон) при каждой итерации приплюсовывается к i.Поэтому на момент итерации,когда i и n должны стать равны,i уже превышает n.Советую посмотреть программу в дебаггере,так лучше поймёшь,когда увидишь. Ещё вот http://ru.wikipedia.org/wiki/%D0%A7%...82%D0%BE%D0%B9
grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
30.06.2009, 13:18  [ТС]     Итерация #4
Понял! Буду разбираться! Спасибо!
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
30.06.2009, 13:21     Итерация #5
это все проблемы с представлением в компе чисел с плавающей запятой, согласен с предудыщими отвечающими... лучше его не юзать в цикле ИМХО... чтобы потом плавающих багов долго и нудно не ловить
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.06.2009, 13:33     Итерация #6
http://xpoint.ru/know-how/Articles/FloatingPointNumbers
Там perl, но фигня одна и та же.

Добавлено через 1 минуту 56 секунд
grrrrr, можно решить эту проблему просто округляя число, например, до двух знаков после запятой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2009, 22:45     Итерация
Еще ссылки по теме:

Incomplete type used in nested type specifier - Итерация по списку аргументов C++
C++ Реверс цифр длинных чисел одномерного массива (итерация и рекурсия)
Неверная итерация C++
C++ При повторных итерация цикла, функция getline не работает
Итерация Turbo Pascal

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
30.06.2009, 22:45     Итерация #7
Очевидно что округлением ничего не решить, только хуже будет.

Нужно избавить от ошибок округления, например так:

Код
int i2, n2;
double i_val;

n2= n*10;
for ( i2= 1; i2<=n2; i2++ ) {
	i_val= 0.1*i2;
	cout << i_val << " ";
}
cout << "\n";
Yandex
Объявления
30.06.2009, 22:45     Итерация
Ответ Создать тему
Опции темы

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