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

Переменная в цикле не принимает значение ноль - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Нужно сформировать массив из двух других массивов http://www.cyberforum.ru/cpp-beginners/thread1820886.html
Есть 2 массива: A, B. Сформировать массив C упорядоченный по возрастанию путем перезаписи информации из массивов A и B. Как можно реализовать слияние без использование сортировки?
C++ Проверить попала ли точка с заданными координатами в заштрихованную область проверить попала ли точка с заданными координатами (х,у)в заштрихованную область #include<stdio.h> #include<math.h> using namespace std; void main() { float x, y, r, R;//начатьное ,конечное и шаг соответственно printf_s("x="); scanf_s("%f", &x); printf_s("y="); http://www.cyberforum.ru/cpp-beginners/thread1820883.html
C++ Подсчёт символов пробел в файле
Добрый вечер, подскажите, чем может быть вызвана данная ошибка и как её можно решить(на скриншоте) 41 строка : random_place(); Кусок кода с работой с файлами: #define _CRT_SECURE_NO_WARNINGS #include <iostream>
C++ Аутентификация и идентификация пользователей
Цель работы: реализовать в «командном процессоре» защиту на уровне пользователя с применением метода паролей или его модификаций; реализовать процедуру управления системой защиты на уровне пользователя Ограничения. 1. Данная лабораторная работа выполняется на любом языке программирования (C/C++, Pascal, Assembler, Basic и т.д.) и в любой среде программирования (C++ Builder, Delphi, Visual...
C++ Вывести на консоль квадратную матрицу, заполненную справа налево http://www.cyberforum.ru/cpp-beginners/thread1820839.html
нужно вывести вот такой двумерный массив: 6 5 4 3 2 1 12 11 10 9 8 7 18 17 16 15 14 13 24 23 22 21 20 19 30 29 28 27 26 25 36 35 34 33 32 31
C++ Разбиение текста на предложения Задача такова - создать текстовый файл, программа должна разбить этот текст на предложения, учитывая : 1. . 2. ... 3. ! 4. !!! 5. ? 6. ??? 7. ?! 8. и смайлики типа ) или ( Как осуществить это разбиение ? подробнее

Показать сообщение отдельно
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2910 / 1446 / 397
Регистрация: 18.10.2014
Сообщений: 2,669
07.10.2016, 04:00     Переменная в цикле не принимает значение ноль
Цитата Сообщение от floverina Посмотреть сообщение
Так вот, почему это происходит?
Это происходит в частности потому, что десятичные числа 0.2 и 0.1, который вы использовали в качестве приращения в своих циклах, вообще не имеют точного представления в виде конечной двоичной дроби с плавающей точкой ("традиционное" представление типа double). Поэтому ваши приращения на самом деле не равны 0.2 и 0.1, а находятся "где-то рядом" с этими значениями. Соответственно, значение b никогда не попадает точно в 0, а значение a никогда не попадает точно в 5. Ничего удивительного в этом нет.

Добавлено через 7 минут
В частности по этой причине очень не рекомендуется писать циклы с приращением плавающего типа, ибо на каждой итерации такого цикла ошибки суммируются и отклонение от "идеала" становится все больше, больше и больше. Лучше уж организовать целочисленный цикл, который будет честно первычислять плавающее значение на каждой итерации

C++
1
2
3
4
5
6
7
for (unsigned ib = 0; ib <= 35; ++ib)
{
  double b = -2.0 + 0.2 * ib;
  for (unsigned ia = 0; ia <= 50; ++ia) {
  {
    double a = 0.1 * ia;
    ...
 
Текущее время: 18:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru