глюк в с++? или что то с типами

вот простенькая прога. элементарная.

#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()? И вообще твоя программаа не компилируется.

Никогда не сравнивай на равенство числа с плавающей запятой. Из-за ошибок округления это бесмысленно. Поэтому для счетчиков используют целочисленные переменные.
Вот правильный исходник, компилирующийся:

#include <iostream>
#include <stdio.h>

using namespace std;

int main (int argc, char **argv) {
double counter;

    for ( counter = 0 ; counter <= 1.1; counter += 0.1 )
    {
        cout << counter - 1.0 << endl;
        if ( counter == 1.0)
            cout << "Fuckkk";
    }
}

обрати внимание на его вывод.

забыл сказать -

забыл сказать - сорри - действительно под винду. причем вариант

#include <iostream.h>
#include <stdio.h>

void main (void) {
double counter;

   for ( counter = 0 ; counter <= 1.1; counter += 0.1 )
   {
       cout << counter << endl;
       if ( (float) counter == (float) 1.0)
           cout << "Fuckkk";
   }

   getchar();
}

вроде бы работает под линуксом хотя под виндами (турбо си ++) не работает все равно...

как раз перед прочтением Вашего ответа я вот к чему пришел.

#include <iostream.h>
#include <stdio.h>

void main (void) {
double counter;

    for ( counter = 0 ; counter <= 1.1; counter += 0.1 )
    {
        cout << counter << " isn't " << counter << " but is ";
        printf("%.16f", counter);
        cout << endl;
        if ( (double) counter == (double) 1.0)
            cout << "Fuckkk";
    }

    getchar();
}

и вот что я увидел..

0 isn't 0 but is 0.0000000000000000
0.1 isn't 0.1 but is 0.1000000000000000
0.2 isn't 0.2 but is 0.2000000000000000
0.3 isn't 0.3 but is 0.3000000000000000
0.4 isn't 0.4 but is 0.4000000000000000
0.5 isn't 0.5 but is 0.5000000000000000
0.6 isn't 0.6 but is 0.6000000000000000
0.7 isn't 0.7 but is 0.7000000000000000
0.8 isn't 0.8 but is 0.7999999999999999
0.9 isn't 0.9 but is 0.8999999999999999
1 isn't 1 but is 0.9999999999999999
1.1 isn't 1.1 but is 1.0999999999999999

только вот как с этим бороться? я имею ввиду если нужно таки сравнить переменную типа 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: Во-первых,

oxygen написал(а):
Во-первых, "глюков в C++" нет, в большинстве случаев они в програмисте

абсолютно согласен - но я бы и писать сюда не стал - если бы мог как то объяснить это сам. ну три строчки программа - counter показывает в дебугере = 1, но выражение counter == 1 стоит как ложь.. вот и обратился с вопросом.. и в конце концов - я ж не написал - вот чертов сишник , такой ляп я нашел в нем! :) я просто задал вопрос :)

oxygen написал(а):
Во-вторых, эта программа не очень похожа на C++. Нет, она конечно скомпилируется, но мешать С и C++ в программе не надо.

ну это же детали просто. ну можно конечно написать

и
using namespace std;
если я Вас правильно понял , т.е. что Вы имеете ввиду..

oxygen написал(а):
В-третьих, сравнивать вещественные числа на равенство нельзя

понятно. вот о чем я и спрашивал. спасибо за ответ.

oxygen написал(а):
PS: не понимаю, как можно говорить о "глюках в C++", да еще на такой программе. С++ уже более 20 лет, и создавался он довольно умными людьми, поэтому таких грубых ошибок в нем нет точно

см. выше что я написал - я сам никак не мог себе объяснить это... да я очень плохо знаю языки программирования вообще и с++ в частности, да я в институте программирование не учил, да и вобще заочно учился, и все что знаю связанное с комьетерной областью - это только то что выучил самостоятельно по книгам , интернету и т.д. да я согласен что есть масса более умных и образованных людей - вот к ним то мой вопрос и адресовался, спасибо за ответ и в частности за "в-третьих" ...

блин не успел

блин не успел отписаться по делу... все уже сказали... :(

Re: блин не успел

Roman написал(а):
блин не успел отписаться по делу... все уже сказали... :(

:)

ну смысл я понял -
1) вещественные нельзя сравнивать на равенство обычным способом, иначе последствия могут быть очень опасными и непредсказуемыми..
2) проверить их можно вычитая одно из другого - по идее если больше нуля результат - то они не равны...
3) знания никогда не бывают лишними :)

всем спасибо за ответы, ребята ! :)

Re: блин не успел

tradakad написал(а):
2) проверить их можно вычитая одно из другого - по идее если больше нуля результат - то они не равны...

точнее если абсолютное значение разности больше эпсилон.
если сделаешь как ты написал, получишь неожиданные результаты.
эпсилон задаешь больше 0, как уже сказали выше.

Re: блин не успел

iv5 написал(а):
эпсилон задаешь больше 0, как уже сказали выше.

эпсилон - это погрешность, так? но вот какову примерную величину можно указать этой погрешности к примеру для бухгалтерской программы?

0.00000005 Смотря о

0.00000005
Смотря о каких суммах речь :)

А где ты в

А где ты в бухгалтерской программе нашел вычисления с плавающей точкой? Там все челочисленное!
А представляешь, если надо будет провести очень большую сумму, скажем триллион триста тысяч баксов, а из-за округления 300 000 исчезнут. В масштабах суммы - это мелочь, но это же не допустимо!
Используй только целочисленные переменные, исчисляй все в копейках и не забудь пропереполнения, подключи библиотеку для работы с бесконечными числами.

Числа с плавающей точкой - это очень коварная вешь. Будешь использовать её не думая, получится большая задница.

А проценты

А проценты считать как? Тоже целочисленно? Всякие там НДС и т.д.

Конечно. Все

Конечно. Все равно в итоговой сумме округлять до копеек. Просто надо порядок действий правильный выбрать, сначала суммировать, а на последнем этаме вычислять проценты. Тогда ошибка будет в пределах одной копейки.

Re: Конечно. Все

KiberGus написал(а):
сначала суммировать, а на последнем этаме вычислять проценты. Тогда ошибка будет в пределах одной копейки.

а когда считаешь процент кредита, то еще и общая стоимость возрастёт ;)
так магазины работают....

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".