Dzielenie dwóch intów = zawsze zero?
Ostatnio zmodyfikowano 2014-07-19 20:01
OczkoSX Temat założony przez niniejszego użytkownika |
» 2014-07-19 19:38:22 Jednak nie może to być zrobione tak jak jest w tym momencie. Mam taki kawałek kodu: void gra( int wybor_dzial, int wybor_poz, int ilosc_zapytan, int przedzial_pocz, int przedzial_kon, int po_przec ) { srand(( unsigned ) time( NULL ) ); int poprawne = 0; double odp; for( int i = 0; i < ilosc_zapytan; i++ ) { double a =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz ) +(( rand() % po_przec ) * 1.0 / po_przec ); double b =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz ) +(( rand() % po_przec ) * 1.0 / po_przec ); if( wybor_dzial == 0 ) { do { cin.clear(); cin.sync(); cout << a << " + " << b << " = "; cin >> odp; } while( cin.fail() ); double popr = a + b; if( odp == popr ) { poprawne++; cout << "DOBRZE!" << endl << endl; } else cout << "ZLE! Poprawny wynik to: " << popr << endl << endl; } Zostało w konsoli wypisane działanie: 85.9 + -97.3. Wynikiem jest liczba -11.4, niestety program tego nie łyka. W debugerze "a" ma wartość 85.900000000000006, a "b" -97.299999999999997. Wynikiem poprawnym jest -11.399999999999991, a liczbą wprowadzoną przez użytkownika jest -11.400000000000000. Problem pojawia się często, aczkolwiek nie zawsze. Zmienną popr wsadziłem tylko dla tego aby sprawdzić wartość wyliczaną przez kompilator. Wcześniej w niej miejsce wstawiałem po prostu "a + b". Najlepsze jest to że jeśli podam wynik "-11.4", dostaję odpowiedż: "ŻLE! Poprawny wynik to: -11.4". Już nie wiem co z tym zrobić. Mógłbym to zaokrąglać ale z tym to znowu trochę roboty |
|
pekfos |
» 2014-07-19 19:45:08 |
|
OczkoSX Temat założony przez niniejszego użytkownika |
» 2014-07-19 19:50:16 Mam wrażenie że to nie to jest problemem. Jeśli w zmiennej "a", zamiast 85.900000000000006, było 85.9, wszystko byłoby ok. Nawet float by wystarczył. Problem jest w linijce z generowaniem wartości zmiennej (rand). Mógłbym tam wynik zaokrąglać, np. te 85.900000000000006 do 85.9, ale mija to się z celem i myślę że są bardziej efektowne sposoby. |
|
pekfos |
» 2014-07-19 20:01:06 Jeśli w zmiennej "a", zamiast 85.900000000000006, było 85.9, wszystko byłoby ok. Nawet float by wystarczył |
Ty po prostu kompletnie nie wiesz, o czym mówisz i do tego jeszcze się upierasz przy swoim. Nie każdą wartość zmiennoprzecinkową da się zapisać. Nie można 85.9, więc masz najbliższą możliwą wartość - wielkie mi co, różnica 15 miejsc po przecinku. Dlatego nie można oczekiwać, że porównywanie takich liczb przez operator == da zamierzony skutek, bo te typy są zbyt mało dokładne. Jeśli to faktycznie taki problem, nie wchodź w liczby zmiennoprzecinkowe i operuj na ułamkach zwykłych. Tu masz o tyle łatwiej, że wystarczy, że będziesz dzielić przez po_przec tylko wtedy, gdy jest to potrzebne - np do wyświetlenia wartości. |
|
1 « 2 » |