Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
#1

Неверная итерация - C++

06.11.2014, 00:08. Просмотров 267. Ответов 6
Метки нет (Все метки)

Привет народ. Объясните пожалуйста, что это за бред? (я подчеркнул)

Неверная итерация
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2014, 00:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неверная итерация (C++):

Итерация - C++
Здравствуйте! for(i=0.1; i<=n; i+=0.1) { cout << i << " "; } Например ввожу 2, а он зараза...

Итерация. не знаю как решить - C++
Вычислить (рис1) Вычисление прекратить,если(рис2) Подсчитать кол-во слагаемых. Буду благодарен за любую помощь.

Чтение файла, лишняя итерация - C++
Вопрос по функции feof(). Я так понимаю она должна сигнализировать о конце файл, если был прочитан последний байт файла. Но у меня в...

Вычислить значение выражения (рекурсия/итерация) - C++
Вычеслить y(n)= 1/n+1/(n-1)+1/(n-2)+1/...+1/1+1дробь2 Решит с использыванием рекурсии и без нее

При повторных итерация цикла, функция getline не работает - C++
Здравствуйте. Подскажите пожалуйста. Цель данного куска кода - ввод названия (артикула) товара. До getline я использовал простой cin, но...

Итераторы и итерация. Оператор >>. Простой текстовый редактор Страуструпа - C++
Добрый день! Есть код Страуструпа из Принципы и практика использования С++ Глава 20, параграф 6. Код описывает простой текстовой...

6
Croessmah
Ушел
Эксперт CЭксперт С++
13564 / 7715 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
06.11.2014, 02:04 #2
Evg: Представление вещественных чисел "на пальцах"
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3976 / 2200 / 553
Регистрация: 18.10.2014
Сообщений: 3,814
06.11.2014, 02:10 #3
Этот "бред" присутствует в вашей переменной с самых первых итераций. Вы его не видите просто потому, что функция вывода значения на экран округляет ваше число и тем самым "облагораживает" выводимые значения.

Подключите <iomanip> и сделайте вывод через

C++
1
cout << setprecision(10) << i << " ";
и вы увидите ваш "бред" намного раньше
0
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.11.2014, 02:30  [ТС] #4
Хорошо, сейчас начну читать предложенную статью, но чтобы не терять время спрошу: А как сделать так, чтобы всего этого "счастья" не было и считало всё так, как ожидается? (ну вы поняли о чём я) Спасибо.
0
IrineK
Заблокирован
06.11.2014, 03:01 #5
Цитата Сообщение от lenchis001 Посмотреть сообщение
и считало всё так, как ожидается?
Вам нужно, чтобы "писало" все так, как ожидается.
Для этого организуете вывод с округлением до нужного знака.
0
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.11.2014, 03:07  [ТС] #6
А можно ли сделать подсчёт с округлением?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3976 / 2200 / 553
Регистрация: 18.10.2014
Сообщений: 3,814
06.11.2014, 03:17 #7
Цитата Сообщение от lenchis001 Посмотреть сообщение
А можно ли сделать подсчёт с округлением?
C округлением до чего именно? Такие числа в компьютере хранятся в двоичном плавающем формате. Для них понятие "округления до некоторого десятичного разряда" не имеет прямого смысла. В частности, число '0.1' в принципе невозможно представить точно в стандартном двоичном плавающем формате. Т.е. округляй-не округляй, все равно ровно '0.1' вы никогда не получите.

Если вас это не устраивает, то придется забыть о встроенных плавающих форматах и реализовывать арифметику самостоятельно. Например, можно перейти к арифметике с фиксированной точкой, т.е. представлять все нецелые значения как целые числа, домножив все на некоторую фиксированную величину.

Вот эквивалент вашего кода в арифметике с фиксированной точкой с одним знаком после запятой (домножение на 10)

C++
1
2
3
4
5
6
7
8
int main()
{
  // 0 * 10 = 0
  // 10 * 10 = 100
  // 0.1 * 10 = 1
  for (unsigned i = 0; i < 100; i += 1)
    cout << i / 10 << "." << i % 10 << " ";
}
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4
4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9
9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9
Как видите, никакого "бреда" в результатах нет.
0
06.11.2014, 03:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2014, 03:17
Привет! Вот еще темы с ответами:

Найти первые N чисел Фибоначчи (рекурсия/итерация, сравнить эффективность) - C++
Найти первые N чисел Фибоначчи двумя способами: с помощью рекурсии и с помощью итерации. Сравнить эффективность алгоритмов.

Реверс цифр длинных чисел одномерного массива (итерация и рекурсия) - C++
Разработать функцию, которая переставляет в обратном порядке цифры заданного длинного целого числа (например, число 5321 превращается в...

Неверная запись в переменную - C++
Вечер добрый, форумчане. Столкнулся с довольно странной для меня проблемой. double x1; cin&gt;&gt;x1; Я ввожу значение 0.2, но в переменную...

Неверная передача значения - C++
Есть typedef enum {a, b, c, d} my; есть функция void MyF(my x) ее вызов в виде MyF(0); MyF(a); работает нормально А...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.