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

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

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

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

06.10.2016, 21:54. Просмотров 195. Ответов 9
Метки нет (Все метки)

У меня есть цикл для переменной 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 до нуля, и от нуля до пяти. В таком варианте оно равнялось нулю, но хочется один цикл.
Так вот, почему это происходит?
0
Миниатюры
Переменная в цикле не принимает значение ноль  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2016, 21:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переменная в цикле не принимает значение ноль (C++):

Неинициализированая переменная принимает значение -858993460 - C++
Здравствуйте форумчане. Есть проблема. Имеется код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;conio.h&gt; using namespace std;...

Объяснить почему переменная принимает данное значение - C++
int v = 5; int a = 0; a = ++v + 10 + 1 + ++v * 2; cout &lt;&lt; &quot;a = &quot; &lt;&lt; a &lt;&lt; endl; кто сможет объяснить, почему здесь а = 32 ? :)....

При вводе слова на русском языке переменная в программе принимает значение латиницы введенного слова - C++
Добрый день уважаемые форумчане! Начал изучение C++, и вот решил создать небольшую программу которая сравнивает вводимое слово с заданным и...

Переменная в цикле for - C++
Пишу консольное приложение, а оно ругается такими ошибками как: main.cpp name lookup of `i' changed for new ISO `for' scoping main.cpp ...

В цикле где выводится матрица j принимает какие-то странные значения. Почему? - C++
воде все верно, по в цикле где выводится матрица j принимает какие-то странные значения. Почему?#include &lt;iostream&gt; #include &lt;algorithm&gt; ...

Почему в цикле do...while переменная a оказывается необъявленной? - C++
Почему в этом коде не while не проверяет переменную &quot;a&quot;? : #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstdio&gt; using...

9
VAN0
58 / 58 / 33
Регистрация: 05.05.2013
Сообщений: 150
Завершенные тесты: 1
06.10.2016, 22:04 #2
https://ru.wikipedia.org/wiki/%D0%AD...B8%D1%81%D1%8C
0
мановар
878 / 312 / 67
Регистрация: 12.03.2016
Сообщений: 1,194
Завершенные тесты: 1
06.10.2016, 22:21 #3
floverina, может весь код приведете
0
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 6
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();
    
                
 
    
}
0
мановар
878 / 312 / 67
Регистрация: 12.03.2016
Сообщений: 1,194
Завершенные тесты: 1
06.10.2016, 22:29 #5
floverina, типичная ошибка при использовании в цикле for вещественных чисел. Эта тема неоднократно упоминалась на форуме, сам сталкивался. К сожалению не могу так быстро дать ссылку чтобы грамотно объяснить.
0
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 6
06.10.2016, 22:35  [ТС] #6
ничего, я подожду)
0
мановар
878 / 312 / 67
Регистрация: 12.03.2016
Сообщений: 1,194
Завершенные тесты: 1
06.10.2016, 22:36 #7
floverina, Цикл не делает последнюю итерацию думаю пригодится
0
aiwprton805
70 / 70 / 26
Регистрация: 30.03.2013
Сообщений: 189
Завершенные тесты: 1
06.10.2016, 22:38 #8
Надо писать не b == 0, а проверять b > -eps && b < eps, где eps взять где-то 10 в -15 степени.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3876 / 2134 / 548
Регистрация: 18.10.2014
Сообщений: 3,748
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;
    ...
1
floverina
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 6
08.10.2016, 15:21  [ТС] #10
Всем спасибо за объяснения
Все поняла, заработало
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2016, 15:21
Привет! Вот еще темы с ответами:

Объявляется ли каждую итерацию переменная-счетчик в цикле for? - C++
Всем привет, расскажу историю возникшего вопроса. Отходил я как-то на курсы с++, и там преподаватель (авторитетный вроде программист,...

Вывести на экран значение t при котором функция x(t) принимает максимальное значение - C++
Объясните, как решить с помощью массива. Только начал изучать C++. Знаю, как вывести максимальный из массива. Но как сделать чтобы в этот...

Почему во время чтения из файла переменная row_i в цикле постоянно обнуляется? - C++
Имеется следующий код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main () { char row;

Может ли переменная X использоваться как счётчик в цикле, в теле которого вычисляется заданная функция? - C++
Может ли переменная х быть параметром (управляющей переменной) в операторе цикла с параметром если в цикле вычисляется функция y=f(x) при 0...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
08.10.2016, 15:21
Ответ Создать тему
Опции темы

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