Problem z porownaniem liczb typu double

0

Czesc,
przygotowuje sie do matury i z przyzwoitosci i dla czystosci sumienia postanowilem w 5 minut napisac prosta funkcje, ktora ma za zadanie rozwiazac problem wydawania reszty.
Otoz wg mojego programu 0.1>=0.1 to false.
Oto kod

const int ile=11;
const double nom[ile]={200,100,50,20,10,5,2,1,0.5,0.2,0.1};

void wydaj_reszte(double co) {
    int jak[ile];
    for(int j=0;j<ile;j++) jak[j]=0;
    int i=0;
    while(co>0) {
            if(co>=nom[i]) {
                co=co-nom[i];
                jak[i]++;
            }
            else {
                i++;
            }
    }
    for(int j=0;j<ile;j++) cout << nom[j] << ": " << jak[j] << endl;
}

Dla danej 2.3 program wykonuje sie w nieskonczonosc. Jesli umieszcze strumien wyjscia w strodku petli, to okazuje sie, ze zmienna 'co' ma wtedy caly czas wartosc rowna 0.1. Ma ktos pomysl w czym tkwi problem? (tak, wiem, ze sa jeszcze nominaly '0.05' etc., ale na takim przykladzie lepiej widac problem, ktory wystepuje takze przy porownaniu z '0.01')

0

A nie mozna tego zrobic inaczej niz zmieniajac typ danych? Bo to nie sa jakies bardzo male liczby...

0

Licz na groszach unsigned long long int.

http://www.h-schmidt.net/FloatConverter/IEEE754.html - wpisz sobie w "Decimal Representation" 0.1 i zobacz pole "After casting to double precision"

0

musisz porównywać wartość bezwzględną różnicy tych zmiennych do maksymalnego błędu, który zakładasz. Powiedzmy, że dopuszczalny błąd wg Ciebie to 0.0001, wtedy warunek powinien wyglądać:

 
if ( std::abs(co - nom[i]) < 0.0001 ) {

}
0

Wszystko bylo ok. Tak jak myslalem. Otoz ten blad... zniknal... Gdy przelaczylem w Code::Blocks build target z 'Release' na 'Debug'. nie mam pojecia czemu tak sie dzialo. Ma ktos jakis pomysl?

0

Bo w trybie debug są trochę inne opcje kompilacji.

Takie rozwiązanie wciąż jest niestabilne, dobrze byłoby napisać pokaźny zbiór danych testowych żeby sprawdzić czy wynik zawsze jest poprawny dla każdych dopuszczalnych danych wejściowych, a nie tylko dla danych, które Ty mu podajesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1