глюк в с++? или что то с типами
tradakad 31 января, 2007 - 13:01
вот простенькая прога. элементарная.
#include <iostream.h> #include <stdio.h> void main (void) { double counter; for ( counter = 0 ; counter <= 1.1; counter += 0.1 ) { cout << counter << endl; if ( counter == 1.0) cout << "Fuckkk"; } getchar(); }
что я только не делал - вот это- cout << "Fuckkk"; - никогда не выводиться..
думаю что трабл ессно можно найти , но вот что это за трабл!
:)
кто что может подсказать, ребята?
»
- Для комментирования войдите или зарегистрируйтесь
замени stdio.h ->
замени
stdio.h -> stdio
iostream.h -> iostream
может заработает....
_________________
Gentoo GNU/Linux 2.6.19 GCC 4.1.1 Dual Xeon
Working on Gentoo for iPAQ hx4700 :-)
не работает...
не работает... думаю не в этом дело..
_________________
Success is simple. Do what's right, the right way, at the right time.
А ты, извиняюсь,
А ты, извиняюсь, под какую ОС пишешь? Что-то мне кажется, что под винды, иначе зачем этот getchar()? И вообще твоя программаа не компилируется.
Никогда не сравнивай на равенство числа с плавающей запятой. Из-за ошибок округления это бесмысленно. Поэтому для счетчиков используют целочисленные переменные.
Вот правильный исходник, компилирующийся:
обрати внимание на его вывод.
забыл сказать -
забыл сказать - сорри - действительно под винду. причем вариант
вроде бы работает под линуксом хотя под виндами (турбо си ++) не работает все равно...
как раз перед прочтением Вашего ответа я вот к чему пришел.
и вот что я увидел..
только вот как с этим бороться? я имею ввиду если нужно таки сравнить переменную типа float или double - или лучше использовать какой то другой тип?
_________________
Success is simple. Do what's right, the right way, at the right time.
Для счетчиков
Для счетчиков использовать целочисленные типы. Если нужно сравнивать double, то использовать >= и <=. Сначала вычесть одно число из другого, а потом оценить их разность. Если она мала, то считаем их равными. А что значит "мала" зависит от конкретной задачи. Надо провести оценку величин, которые будут использоваться в задаче, оценить погрешности вычисления, знать допустимые погрешности для данной задачи, оценить ошибки в используемых численных методах (а там может набегать ошибки в несколько поряднов, в учебник по ЧМам есть пример системы 2x переменных, где при вычислении в лоб с точностью до 5го знака ошибка получается около 1).
Во-первых,
Во-первых, "глюков в C++" нет, в большинстве случаев они в програмисте
Во-вторых, эта программа не очень похожа на C++. Нет, она конечно скомпилируется, но мешать С и C++ в программе не надо.
В-третьих, сравнивать вещественные числа на равенство нельзя
PS: не понимаю, как можно говорить о "глюках в C++", да еще на такой программе. С++ уже более 20 лет, и создавался он довольно умными людьми, поэтому таких грубых ошибок в нем нет точно
Re: Во-первых,
абсолютно согласен - но я бы и писать сюда не стал - если бы мог как то объяснить это сам. ну три строчки программа - counter показывает в дебугере = 1, но выражение counter == 1 стоит как ложь.. вот и обратился с вопросом.. и в конце концов - я ж не написал - вот чертов сишник , такой ляп я нашел в нем! :) я просто задал вопрос :)
ну это же детали просто. ну можно конечно написать
и
using namespace std;
если я Вас правильно понял , т.е. что Вы имеете ввиду..
понятно. вот о чем я и спрашивал. спасибо за ответ.
см. выше что я написал - я сам никак не мог себе объяснить это... да я очень плохо знаю языки программирования вообще и с++ в частности, да я в институте программирование не учил, да и вобще заочно учился, и все что знаю связанное с комьетерной областью - это только то что выучил самостоятельно по книгам , интернету и т.д. да я согласен что есть масса более умных и образованных людей - вот к ним то мой вопрос и адресовался, спасибо за ответ и в частности за "в-третьих" ...
блин не успел
блин не успел отписаться по делу... все уже сказали... :(
Re: блин не успел
:)
ну смысл я понял -
1) вещественные нельзя сравнивать на равенство обычным способом, иначе последствия могут быть очень опасными и непредсказуемыми..
2) проверить их можно вычитая одно из другого - по идее если больше нуля результат - то они не равны...
3) знания никогда не бывают лишними :)
всем спасибо за ответы, ребята ! :)
Re: блин не успел
точнее если абсолютное значение разности больше эпсилон.
если сделаешь как ты написал, получишь неожиданные результаты.
эпсилон задаешь больше 0, как уже сказали выше.
Re: блин не успел
эпсилон - это погрешность, так? но вот какову примерную величину можно указать этой погрешности к примеру для бухгалтерской программы?
0.00000005 Смотря о
0.00000005
Смотря о каких суммах речь :)
А где ты в
А где ты в бухгалтерской программе нашел вычисления с плавающей точкой? Там все челочисленное!
А представляешь, если надо будет провести очень большую сумму, скажем триллион триста тысяч баксов, а из-за округления 300 000 исчезнут. В масштабах суммы - это мелочь, но это же не допустимо!
Используй только целочисленные переменные, исчисляй все в копейках и не забудь пропереполнения, подключи библиотеку для работы с бесконечными числами.
Числа с плавающей точкой - это очень коварная вешь. Будешь использовать её не думая, получится большая задница.
А проценты
А проценты считать как? Тоже целочисленно? Всякие там НДС и т.д.
Конечно. Все
Конечно. Все равно в итоговой сумме округлять до копеек. Просто надо порядок действий правильный выбрать, сначала суммировать, а на последнем этаме вычислять проценты. Тогда ошибка будет в пределах одной копейки.
Re: Конечно. Все
а когда считаешь процент кредита, то еще и общая стоимость возрастёт ;)
так магазины работают....