Вы здесь

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

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

#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
iostream.h -> iostream
может заработает....

_________________
Gentoo GNU/Linux 2.6.19 GCC 4.1.1 Dual Xeon
Working on Gentoo for iPAQ hx4700 :-)

—

___________________________________________
Working on Gentoo for iPAQ hx4700 and Openmoko Neo Freerunner :-)
Если у вас компьютер с Windows, есть два выхода: выбросить компьютер в форточку или выбросить форточки с компьютера

не работает... думаю не в этом дело..
_________________
Success is simple. Do what's right, the right way, at the right time.

—

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.

—

Success is simple. Do what's right, the right way, at the right time.

Для счетчиков использовать целочисленные типы. Если нужно сравнивать double, то использовать >= и <=. Сначала вычесть одно число из другого, а потом оценить их разность. Если она мала, то считаем их равными. А что значит "мала" зависит от конкретной задачи. Надо провести оценку величин, которые будут использоваться в задаче, оценить погрешности вычисления, знать допустимые погрешности для данной задачи, оценить ошибки в используемых численных методах (а там может набегать ошибки в несколько поряднов, в учебник по ЧМам есть пример системы 2x переменных, где при вычислении в лоб с точностью до 5го знака ошибка получается около 1).

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

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

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

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

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

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

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

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

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

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

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

—

Success is simple. Do what's right, the right way, at the right time.

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

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

:)

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

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

—

Success is simple. Do what's right, the right way, at the right time.

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

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

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

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

—

Success is simple. Do what's right, the right way, at the right time.

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

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

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

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

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

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

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