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

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

Войти
Регистрация
Восстановить пароль
 
 
Петр91
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
#1

Глюк при заполнении массива - C++

21.06.2011, 15:33. Просмотров 714. Ответов 19
Метки нет (Все метки)

Заполняю массив
Код
float row[501]
float j=0;
for (int i=0;i<501;i++)
{
     row[i]=j;
     cout<<j<<endl;
     j += 0.02;
}
Массив заполняется числами: 0;0.02;0.04 но в середи и конце вылезают такие числа как: 6.24;6.25999;6.27999. Так чисел сорок, потом нормально и опять: 8.52001; 8.54001 в чем дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2011, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Глюк при заполнении массива (C++):

Ошибка при заполнении массива - C++
Помогите пожалуйста решить проблему: Это программа для игры в крестики нолики. В первой функции void instruction() необходимо вывести...

ошибка при заполнении массива - C++
хочу заполнить массивы класса (и сразу же записать в файл), если выбрать количество записей - 1, то все работает нормально, но больше...

Ошибка при заполнении массива - C++
Объявляю и пытаюсь заполнить так: TArray__1&lt;System::Byte&gt; *buffer; buffer = new TArray__1 &lt;System::Byte&gt; (6); buffer='r'; ...

Ошибка исполнения при заполнении массива - C++
Программа работы с квадратными матрицами. Используются динамические массивы. Задание из вуза. Использование функций запрещено по...

Ошибка при заполнении динамического массива - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int N, i, a, l; int head = -1; char ch; int *s = new int ; ...

Сообщение о ошибке при заполнении массива - C++
Привет всем! Возникла проблемма при заполнении массива малыми числами. При компиляции выводится сообщение &quot;floating constant truncated...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
21.06.2011, 15:35 #2
C++
1
float row[501]
А вы тут точку с запятой случайно забыли?
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
21.06.2011, 15:37 #3
C++
1
cout<<FormatFloat("0.00",j).c_str()<<endl;
Или так
C++
1
2
3
4
5
6
...
float j=0;
cout.setf(ios::fixed, ios::floatfield);
cout.precision(2);
for (int i=0;i<501;i++)
...
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
21.06.2011, 15:44 #4
погрешность накопилась
Петр91
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
21.06.2011, 15:45  [ТС] #5
Мне не просто вывести надо, а потом еще сравнивать элементы массива!
Код
float row[501];
float j=0;
for (int i=0;i<501;i++)
{
     row[i]=j;
     cout<<j<<endl;
     j += 0.02;
}
if (row[0]==0)
   cout<<"Win!";    -   Выводит Win;

if (row[1]==0.02)
   cout<<"Win!";   - НЕ  выводит ниче
Вопрос, что не так? Погрешность? а почему 0.02 не равно 0.02 это второй элемент всего! Пишу в VS 2010
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
21.06.2011, 15:48 #6
округлять, без округления бесполезно double сравнивать
Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
21.06.2011, 15:49 #7
замените float на double
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.06.2011, 15:51 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float row[501];
float j = 0.0f;
 
for (int i = 0; i < 501; i++ )
{
   row[i] = j;
   cout << j << endl;
   j += 0.02f;
}
 
if ( row[0] == 0.0f )
   cout << "Win!";
 
if ( row[1] == 0.02f )
   cout << "Win!";
Обратите внимание на синтаксис 0.02f. Буква f означает, что это число имеет тип float. При явном указании типа исключаются ошибки при преобразовании типов (потому, что преобразование как таковое не требуется).
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
21.06.2011, 15:56 #9
talis, проблема же не в преобразовании, а в том, что большинство конечных в десятичной форме дробей при двоичной записи становятся бесконечными и их просто невозможно точно представить ни числом float, ни double...
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.06.2011, 15:57 #10
grizlik78, вы скомпилируйте и сравните вариант автора и мой. Проблема-то ушла.
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
21.06.2011, 15:59 #11
ну да, только автору следует учесть, что он просто отложил проблему
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
21.06.2011, 16:04 #12
Скомпилировал. Сравнил. Абсолютно одинаковый результат.
Петр91
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108
21.06.2011, 16:06  [ТС] #13
Заменил float на double вывел массив, все ок! Даже сравнивает правильно целые числа! ноль, один, пять. А вот с дробными проблема! Если писать row[]=0.02 не сравнивает, а через запятую row[]=0,02 понимает.. Шо за фигня...
Сделал как talsi говорит float j=0.0f; Все равно погрешность появляется.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
21.06.2011, 16:07 #14
Цитата Сообщение от Петр91 Посмотреть сообщение
Если писать row[]=0.02 не сравнивает, а через запятую row[]=0,02
Если писать действительно = то это ни разу не сравнение.
А если сравнивать с 0,02, то это эквивалентно просто двойке
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.06.2011, 16:09 #15
Цитата Сообщение от grizlik78 Посмотреть сообщение
Скомпилировал. Сравнил. Абсолютно одинаковый результат.
C::B 10.05 w/ gcc version 4.4.1 (TDM-2 mingw32)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 16:09
Привет! Вот еще темы с ответами:

Вылетает программа при заполнении массива - C++
Добрый день. Решил написать простой код отрисовки карты в консоли. Идея: 1.Создаю объект структуры, содержащий перечень координат в...

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

Ошибка при заполнении массива малыми числами - C++
Привет всем! В программе необходимо использовать массив с малыми числами, порядка 1.47243e-331. Элементы массива описаны как &quot;long...

Вывод пустых символов при рандомном заполнении массива - C++
Вот так это выглядит, не могу понять в чем проблема. Выводит через раз, периодически запускается все нормально, но в 4 случаях из 5 вот...


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

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

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