Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dzielenie dwóch intów = zawsze zero?

Ostatnio zmodyfikowano 2014-07-19 20:01
Autor Wiadomość
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:
C/C++
void gra( int wybor_dzial, int wybor_poz, int ilosc_zapytan, int przedzial_pocz, int przedzial_kon, int po_przec ) { // Funkcja z wlasciwa gra
    srand(( unsigned ) time( NULL ) ); // Liczby losowe
   
    int poprawne = 0; // Ilosc poprawnych odpowiedzi
    double odp; // Odpowiedz
   
    for( int i = 0; i < ilosc_zapytan; i++ ) { // Petla do osiagniecia ilosci zapytan
        double a =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz ) +(( rand() % po_przec ) * 1.0 / po_przec ); // Losowanie liczby A
        double b =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz ) +(( rand() % po_przec ) * 1.0 / po_przec ); // Losowanie liczby B
       
        if( wybor_dzial == 0 ) { // Jesli wybrane zostalo dodawanie
            do { // Obsluga bledow
                cin.clear();
                cin.sync();
                cout << a << " + " << b << " = "; // Wypisanie dzialania
                cin >> odp;
            } while( cin.fail() );
           
            double popr = a + b;
            if( odp == popr ) { // Jesli odpowiedz jest poprawna
                poprawne++; // Inkrementuj zmienna
                cout << "DOBRZE!" << endl << endl; // Wyswietl komunikat
            }
            else cout << "ZLE! Poprawny wynik to: " << popr << endl << endl; // Jesli nie to wyswietl komunikat
           
        }

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
P-114079
pekfos
» 2014-07-19 19:45:08
P-114081
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. 
P-114083
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.
P-114085
1 « 2 »
Poprzednia strona Strona 2 z 2