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

Можно ли использовать не целые числа в For? - C++

Восстановить пароль Регистрация
 
JaguarT51
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 9
10.04.2014, 04:06     Можно ли использовать не целые числа в For? #1
Здравствуйте !
Мне необходимо провести примерно такое действие:
C++
1
2
for (x=0.2;x<0.6;x+0.1)
 {cin>>a;}
Как можно это сделать???Именно оператором For!!!И вообще это возможно???
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2014, 04:06     Можно ли использовать не целые числа в For?
Посмотрите здесь:

Даны два целых числа M но N. Вывести все целые числа из промежутка [M,n] C++
C++ Дана строка, содержащая целые числа. Вывести на экран только чётные числа
C++ Задана строка, содержащая целые числа (максимум 15 чисел). Упорядочить целые числа в строке по убыванию.
C++ Вводить с клавиатуры целые числа (>0) и выводить на экран квадраты этих чисел до тех пор, пока не будет введено число 0. Использовать цикл do...while.
C++ Дано два числа А и В (А<В). Вывести в порядке увеличения все целые числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2014, 04:31     Можно ли использовать не целые числа в For? #2
Цитата Сообщение от JaguarT51 Посмотреть сообщение
Именно оператором For!!!И вообще это возможно???
А попробовать, никак?

Добавлено через 4 минуты
Цитата Сообщение от JaguarT51 Посмотреть сообщение
x+0.1
x здесь никак не меняется.
JaguarT51
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 9
10.04.2014, 04:35  [ТС]     Можно ли использовать не целые числа в For? #3
Я пробывал у меня цикл не мменяет переменную !Есть ли возможность её поменять???
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 282
Завершенные тесты: 1
10.04.2014, 04:38     Можно ли использовать не целые числа в For? #4
JaguarT51, именно оператором for - нельзя. Можно while
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2014, 04:41     Можно ли использовать не целые числа в For? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от JaguarT51 Посмотреть сообщение
Есть ли возможность её поменять???
Есть такая возможность:
C++
1
2
for (x=0.2;x<0.6;x+=0.1)
 {cin>>a;}
JaguarT51
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 9
10.04.2014, 04:42  [ТС]     Можно ли использовать не целые числа в For? #6
Спасибо!!!
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
10.04.2014, 08:19     Можно ли использовать не целые числа в For? #7
Цитата Сообщение от JaguarT51 Посмотреть сообщение
Как можно это сделать???Именно оператором For!!!И вообще это возможно???
На редкость интересный вопрос. В современных процессорах эта возможность есть. В с99 есть макросы для этих операций. Не помню, но знаю что есть. К размышлению:
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
union ieee754_float
  {
    float f;
 
    /* This is the IEEE 754 single-precision format.  */
    struct
      {
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int negative:1;
    unsigned int exponent:8;
    unsigned int mantissa:23;
#endif              /* Big endian.  */
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int mantissa:23;
    unsigned int exponent:8;
    unsigned int negative:1;
#endif              /* Little endian.  */
      } ieee;
  };
 
#define IEEE754_FLOAT_BIAS  0x7f /* Added to exponent.  */
 
 
union ieee754_double
  {
    double d;
 
    /* This is the IEEE 754 double-precision format.  */
    struct
      {
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int negative:1;
    unsigned int exponent:11;
    /* Together these comprise the mantissa.  */
    unsigned int mantissa0:20;
    unsigned int mantissa1:32;
#endif              /* Big endian.  */
#if __BYTE_ORDER == __LITTLE_ENDIAN
# if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
    unsigned int mantissa0:20;
    unsigned int exponent:11;
    unsigned int negative:1;
    unsigned int mantissa1:32;
# else
    /* Together these comprise the mantissa.  */
    unsigned int mantissa1:32;
    unsigned int mantissa0:20;
    unsigned int exponent:11;
    unsigned int negative:1;
# endif
#endif              /* Little endian.  */
      } ieee;
<tag>Сравнение чисел с плавающей точкой</tag>.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
10.04.2014, 12:36     Можно ли использовать не целые числа в For? #8
Комментарий.
Вопрос похоже возник из-за непонимания смысла for
C++
1
2
3
4
5
for( 
x=0.1; // любой оператор, который выполняется один раз в начале цикла
x<=0.6; // оператор, принимающий логическое значение, 
            //которое является основанием для повторения тела цикла
x+=0.1) // любой оператор, который выполняется в конце цикла перед проверкой на повторение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 14:25     Можно ли использовать не целые числа в For?
Еще ссылки по теме:

C++ Даны целые числа A B C, проверить можно ли из них составить геометрическую прогрессию
В порядке возрастания напечатать те целые числа из диапазона 1..10000, которые можно представить в указанном виде C++
В одномерном массиве, элементы которого - целые числа, удалить все четные числа C++

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

Или воспользуйтесь поиском по форуму:
BlackSpace
135 / 128 / 50
Регистрация: 15.03.2014
Сообщений: 275
10.04.2014, 14:25     Можно ли использовать не целые числа в For? #9
JaguarT51, необходимо понимать, что дробные числа представляются с ограниченной точностью в памяти.
Не рекомендую сравнивать напрямую два вещественных числа, так как можно получить неожиданные результаты.
Постараюсь пояснить на примерах.

Пример 1. Тут, вполне возможно, все будет работать как и ожидалось.
C++
1
2
3
4
5
...
    double x;
    for ( x = 0.2; x < 0.6; x += 0.1 )
        cout << x << endl;
...
Вывод программы
Кликните здесь для просмотра всего текста
0.2
0.3
0.4
0.5


Пример 2. Однако, в следующем пример вывод программы может быть несколько не такой какой хотелось бы.
C++
1
2
3
4
5
...
double x;
    for ( x = 0.299; x < 0.3; x += 0.0001 )
        cout << x << endl;
...
Вывод программы
Кликните здесь для просмотра всего текста
0.299
0.2991
0.2992
0.2993
0.2994
0.2995
0.2996
0.2997
0.2998
0.2999 // должно быть последним в выводе
0.3 // откуда ? : )

Дело в том, что последнее в выводе значение 0.3 округленное.

Можно сделать вывод с повышенной точностью.
C++
1
2
3
4
5
6
7
8
...
#include <iomanip>
...
double x;
    cout << fixed << setprecision( 16 );
    for ( x = 0.299; x < 0.3; x += 0.0001 )
        cout << x << endl;
...
Тогда вывод будет
Кликните здесь для просмотра всего текста
0.2990000000000000
0.2991000000000000
0.2992000000000000
0.2993000000000000
0.2993999999999999
0.2994999999999999
0.2995999999999999
0.2996999999999999
0.2997999999999999
0.2998999999999999 // должно быть последним в выводе
0.2999999999999999 // этого тут не должно было быть, но оно меньше чем 0.3 и оно тут есть


В некоторых местах данного вывода хорошо видно что вещественные числа хранятся с ограниченной точностью.

Один из путей решения.
Подсчитать заранее количество необходимых шагов и использовать целочисленное сравнение
в цикле.

Пример 3. Приведу программу полностью.
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
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
int main() {
 
    // считаем, что мы уверены, что a, b и h положительные
    // а также, что b > a и h <= b - a
    double a = 5.5551; // нижняя граница
    double b = 5.5552; // верхняя граница
    double h = 0.00001; // шаг вычислений
 
    // считаем количество шагов
    int count = fabs( floor( ( ( b - a ) /  h ) + 0.5 ) ); // важно верно посчитать количество шагов
    // fabs( floor( ( ( b - a ) /  h ) + 0.5 ) ) + 1; // + 1 если включаем в расчет верхнюю границу ( 5.5552 в нашем случае )
 
    cout << "Количество шагов = " << count << endl;
 
    cout << fixed << setprecision( 16 );
    for ( int i = 0; i < count; ++i ) { // тут уже целочисленное сравнение
        double x = a + h * i;
        cout << x << endl; // и вывод, который ожидаем
    }
 
    return 0;
}
Вывод программы
Кликните здесь для просмотра всего текста
Количество шагов = 10
5.5551000000000004
5.5551100000000000
5.5551200000000005
5.5551300000000001
5.5551400000000006
5.5551500000000003
5.5551600000000008
5.5551700000000004
5.5551800000000000
5.5551900000000005


Существует и другой путь.
Сравнивать два вещественных числа с определенной точностью.

Пример 4.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main() {
 
    // считаем, что мы уверены, что a, b и h положительные
    // а также, что b > a и h <= b - a
    double a = 0.0003;//5.55551; // нижняя граница
    double b = 0.0004;//5.55552; // верхняя граница
    double h = 0.000001; // шаг вычислений
    double eps = 0.0000001; // точность вычисления должна быть на порядок выше чем шаг вычислений
 
    cout << fixed << setprecision( 16 );
 
    for ( double x = a; ( b - x ) > eps; x += h ) // сравниваем с определнной точностью
        cout << x << endl;
 
    return 0;
}
Вывод программы как и ожидалось.
Кликните здесь для просмотра всего текста
...
0.0003940000000000
0.0003950000000000
0.0003960000000000
0.0003970000000000
0.0003980000000000
0.0003990000000000


При работе с вещественными числами нужно проявлять повышенную внимательность и контроль. Также необходимо помнить о том, что при расчетах может накапливаться погрешность.
Yandex
Объявления
10.04.2014, 14:25     Можно ли использовать не целые числа в For?
Ответ Создать тему
Опции темы

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