Skocz do zawartości

Recommended Posts

Napisano

Witam!

Mam pewien problem z float'em ( a wlasciwe ze wszystkimi zmiennoprzecinkowymi), otoz odejmujac wychodza mi jakies bzdury tj:

float x = 1;

        while(x >= 0)
        {
                x -= 0.1;
                std::cout << x<< std::endl;
        }

wyniki sa u mnie, hmm... dosc dziwne:

[quote=kompilator]
0.9
0.8
// tak az do...
0.2
// ale teraz...
0.0999999
-7.30157e-08 //podejrzewam ze u innych te dwa wyniki beda inne
// tak samo inne sa dla double i long double

[/quote]

smieszne ale prawdziwe...

co Wy o tym sadzicie...

p.s. pisze w bcb 6.0 personal

//edit
ale jestem slepy, pomylily mi sie dzialy, ale juz prznioslem :-)

//edit 2
probowalem tego kodu w dev-ie, wyniki takie same, sfrustrowanie siega zenitu

Napisano

Typy zmienoprzecinkowe charakteryzuja sie tym, ze maja skonczona dokladnosc w przeciwienstwie do calkowitych. Tzn iles bitow przypada na na ceche i iles na mantyse(Liczba=M*2^C).Poza tym 0.1 ma chyba nieskonczone rozwiniecie(gdybys chcial 0.1 przedstawic binarnie) w przeciwienstwie np do 0.5 .Stad ta niedokladnosc. Dlatego nigdy nie powinno sie dawac warunku rownosci dla liczb zmiennoprzecinkowych bo program pojdzie w maliny.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...