![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Есть такая строка :
for (j = 0;((exchange[j+1] != 0) || (exchange[j+1] != 0.05));j++); после того как ее исполнения значение переменной j == 6017, а значение exchange[j+1] == 1.#QNAN. Первый елемент exchange[0] = 7.0, остальные - 0.0.Компилятор - Visual C++ 6.0. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: нет Всего: 12 |
Так в чём состоит вопрос?
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
exchange какого типа?
пробуй так:
Добавлено @ 22:24
|
||||
|
|||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
>>В том, что цикл доолжен завершиться (по данным) на первой итерации, а доходит до 6017-ой, при этом не выполнив ни одного условия.
Да прикол даже не в том, он не выполняеться 6017 раз, он просто подгружает проц(Пень4 2.8ГГц) до 60% процентов, секунд 10 думает, и сразу переходит на слудующую строку с такими значениями. Добавлено @ 22:32 А если написать так : for (j = 0;((exchange[j+1] != 0) || (exchange[j+1] != 0.05));j++) {m = j;}; , то он тогда выполняется 6017 раз. В чём прикол? Причем здесь вообще 6017? Это сообщение отредактировал(а) dont - 6.8.2005, 22:29 |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А это тебе просто повезло, что в памяти на 6017 месте от начала твоего массива exchange, дейсвительно оказалось значение прерывающее цикл |
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Читай опять, по буквам. |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Итак, exchange, судя по всему, имеет тип float или double. Проверять типы с плавающей точкой на строгое (не)равенство нельзя. То есть можно, конечно, но смысла это особого не имеет
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
|||
|
||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Да читать то я умею, но вот только твой код не помогает.
Дак и в памяте по адресу, который соответствует exchange[2] стоит вовсе другое число, а элемент массива с индексом 6017 очень круто, т.к. таких элементов у меня всего 6000! Добавлено @ 22:53
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
А так работает:
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Какая разница? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Программа не знает сколько у тебя элементов и шурует дальше по памяти пока та не кончится или условие всё таки не выполнится
Void немног8о не то имеет ввиду. Дело в ом, что числа 0.005 может не существовать. Когда работаешь в плавающей точкой, никогда нельзя быть уверенным, что то заначение, которое нужно, можно таким типом данных точно представить. Поэтому надо использовать погрешность. |
||||
|
|||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
>>Какая разница?
Большая! 2 Fixin : Большое спасибо , так работает, но все же интересно чем тот вариант не подходит, они же аналогичные по сути!!! |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
|||
|
||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
>>Программа не знает сколько у тебя элементов и шурует дальше по памяти пока та не кончится или условие всё таки не выполнится .
Возможно, С++ только начинаю учить, но в Паскале сразу бы ошибку выкинуло! |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
В с++ надо всё самому делать. И проверки все тоже. Этим язык и хорош, что ты "напрямую" с процессором общаешься
|
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Хотите верьте, хотите нет, но сравните:
1) Не работает
Добавлено @ 23:14 Те вся разница в индексе, точнее его написании. Добавлено @ 23:18 Тоже не верно... |
||||
|
|||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Ну само собой не так работоет, ты ж вместо 1 написал 2! =)А у меня просто ошибка в том, что мозгов нету! =))) В первой месаге этого цикла логическая ошибка, цикл будет вечно исполняться. =) Извените за напрасное беспокойство.
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Да, бывает...
Это сообщение отредактировал(а) Fixin - 6.8.2005, 23:55 |
|||
|
||||
| LPBOY |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
На вопрос уже давно ответил Void).
Вещественные числа НИКОГДА нельзя сравнивать на равенство\неравенство! Даже если так работает,
то это просто повезло, на это нельзя надеяться. Надо сравнивать модуль разности операндов с некоторой малой величиной, которую в условиях данной задачи можно считать нулем. Попробуйте запустить такой пример и посмотреть на результат:
Если переписать этот пример на Паскаль, то будет то же самое. Тут дело не в языке, а во внутреннем представлении вещественных чисел. Вспомнился похожий спор, который возник вот тут: http://forum.shelek.com/index.php/topic,6441.0.html --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||
|
|||||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Добавлено @ 10:49 И по той ссылке сравниваются две преременные, там нужно это сравнение по точности, а если с константой, то, значит, ему нужно точное значение. |
|||
|
||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Значит там были две ошибки Вот еще ссылка на статью (только что нагуглил): http://www.cygnus-software.com/papers/comp...aringfloats.htm
Разницы никакой нет! Запусти мой пример из предыдущего поста: там тоже сравнение с константой, или смотри статью... Это сообщение отредактировал(а) LPBOY - 7.8.2005, 10:59 --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Тк в том примере ты и получаешь неточное значение, а если нужно отсеять 1.0 ни больше, ни меньше?
|
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Модератор: Название темы должно отражать ее суть!
--------------------
|
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
2Fixin Я хотел помочь исправить ошибки в коде, а не спорить...
Если ты мне не веришь, то делай как хочешь... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Верю, я говорю, что есть РАЗНЫЕ случаи, вот и все. Думаешь, сам не сталкивался? Тогда бы не спорил.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |