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

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

Восстановить пароль Регистрация
 
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 5
06.10.2016, 21:54     Переменная в цикле не принимает значение ноль #1
У меня есть цикл для переменной b, в который вложен цикл для переменной а:
C++
1
2
3
4
5
6
7
8
9
10
for (b = -2; b < 5.01; b += 0.2){
    for (a = 0; a <= 5; a += 0.1) {
     Здесь формулы
      }
      }
      cout << "При b = " << b
        << " и a = " << a
        << " x =" << x
        << endl;
    }
При выполнении а ведет себя нормально, а b доходит до -0,2 и в следующем шаге принимает значение -2,77 в степени... При этом ответ правильный, как будто b - ноль. b <=5 тоже не работает - b не принимает значение 5, цикл завершается на 4.8.
Пробовала разделять цикл на два разных: b от -2 до нуля, и от нуля до пяти. В таком варианте оно равнялось нулю, но хочется один цикл.
Так вот, почему это происходит?
Миниатюры
Переменная в цикле не принимает значение ноль  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2016, 21:54     Переменная в цикле не принимает значение ноль
Посмотрите здесь:

В цикле где выводится матрица j принимает какие-то странные значения. Почему? C++
Функция не принимает значение C++
При вводе слова на русском языке переменная в программе принимает значение латиницы введенного слова C++
C++ Переменная в цикле for
Почему во время чтения из файла переменная row_i в цикле постоянно обнуляется? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VAN0
45 / 45 / 27
Регистрация: 05.05.2013
Сообщений: 125
Завершенные тесты: 1
06.10.2016, 22:04     Переменная в цикле не принимает значение ноль #2
https://ru.wikipedia.org/wiki/%D0%AD...B8%D1%81%D1%8C
мановар
 Аватар для мановар
251 / 80 / 19
Регистрация: 12.03.2016
Сообщений: 303
Завершенные тесты: 1
06.10.2016, 22:21     Переменная в цикле не принимает значение ноль #3
floverina, может весь код приведете
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 5
06.10.2016, 22:25  [ТС]     Переменная в цикле не принимает значение ноль #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <stdio.h>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
#include <math.h>
#include <windows.h>
#include <conio.h>
 
 
using namespace std;
 
 
int main()
{   
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    csbi.dwSize.Y = 5000;//5000 строк
    SetConsoleScreenBufferSize(hConsole, csbi.dwSize);
    
 
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    const double Pi = 3.14;
    double x, a, b, c, y;
  cout << "Введите значение с:";
    cin >> c;
 
  for (b = -2; b < 5.01; b += 0.2){
    for (a = 0; a <= 5; a += 0.1) {
      if (b < 0) {
        x = (3 * a * b - (abs(3.5*c - 56) + sqrt(abs(b))));
      }
      else {
 
  
      if (b == 0.0) {
        x = -(abs(3.5*c - 56));
        break;
      }
      else {
        if (b > 0 && b <= 0.5) {
          x = (3.5*a*b);
        }
        else {
          x = pow(cos(a / 2), 2) + pow(cos(3 * b / 2), 2) - pow(sin(2 * a*b), 2) - pow(sin(4 * b), 2);
        }
      }
      }
 
      if (x =! 0 && a =! Pi) {
      y = (cos(9*x) - cos(7*x) + cos(3*a) - cos(x))
      }
      else {
        y = 
      }
      cout << "При b = " << b
        << " и a = " << a
        << " x =" << x
        << endl;
    }
 
 
 
  }_getch();
    
                
 
    
}
мановар
 Аватар для мановар
251 / 80 / 19
Регистрация: 12.03.2016
Сообщений: 303
Завершенные тесты: 1
06.10.2016, 22:29     Переменная в цикле не принимает значение ноль #5
floverina, типичная ошибка при использовании в цикле for вещественных чисел. Эта тема неоднократно упоминалась на форуме, сам сталкивался. К сожалению не могу так быстро дать ссылку чтобы грамотно объяснить.
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 5
06.10.2016, 22:35  [ТС]     Переменная в цикле не принимает значение ноль #6
ничего, я подожду)
мановар
 Аватар для мановар
251 / 80 / 19
Регистрация: 12.03.2016
Сообщений: 303
Завершенные тесты: 1
06.10.2016, 22:36     Переменная в цикле не принимает значение ноль #7
floverina, Цикл не делает последнюю итерацию думаю пригодится
aiwprton805
 Аватар для aiwprton805
64 / 64 / 23
Регистрация: 30.03.2013
Сообщений: 178
Завершенные тесты: 1
06.10.2016, 22:38     Переменная в цикле не принимает значение ноль #8
Надо писать не b == 0, а проверять b > -eps && b < eps, где eps взять где-то 10 в -15 степени.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2907 / 1443 / 397
Регистрация: 18.10.2014
Сообщений: 2,659
07.10.2016, 04:00     Переменная в цикле не принимает значение ноль #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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;
    ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2016, 15:21     Переменная в цикле не принимает значение ноль
Еще ссылки по теме:

C++ Вывести на экран значение t при котором функция x(t) принимает максимальное значение
Объявляется ли каждую итерацию переменная-счетчик в цикле for? C++
C++ Почему в цикле do...while переменная a оказывается необъявленной?

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

Или воспользуйтесь поиском по форуму:
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 5
08.10.2016, 15:21  [ТС]     Переменная в цикле не принимает значение ноль #10
Всем спасибо за объяснения
Все поняла, заработало
Yandex
Объявления
08.10.2016, 15:21     Переменная в цикле не принимает значение ноль
Ответ Создать тему
Опции темы

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