niedziela, 17 lutego 2013

Zmienne #3: Typ Float - zmiennoprzecinkowe liczby

Dobra powrót po sesji (a później opijaniu i lenistwie - też jestem człowiekiem ^^) Każdy kto słyszał o problemach z porównywaniem liczb zmiennoprzecinkowych zapewne czuje nieco temat.

Pierwsze, na co trzeba zwrócić uwage - nie wszystkie liczby zmiennoprzecinkowe mogą zostać idealnie odzwierciedlone przez komputer w postaci binarnej, tak więc możemy spodziewać się bugów.

Proof:
Ile a powinno wynosić? A no nie więcej niż 0.06, a jednak debugger pokazuje 0.0600000024. BEEEEEEEP! Właśnie delikatnie popsułem Ci humor, w końcu mogło by to byś bardziej bajeczne no nie? :)
Sprawdźmy inny przykład: asum = 0.9999907

Oczywiście nie zawsze tak jest, sporo zależy od kompilera z jakiego korzystamy, aczkolwiek założenie, że każdy błąd naprawi za nas jest niepoprawne, i 100% w tym przypadku błędne!!!

Jak z tym walczyć? Co się tak na prawdę dzieje?
Typ float traci panowanie nad sobą, gdy przekraczana jest wartość jej precyzji, następują wtedy zaokrąglenia (które czasem nie mają sensu)

I tak sobie myślę: utnijmy ten szalejowy koniec

Co prawda jest to mało estetyczna metoda, ale: Nareszcie zwraca normalny wynik, czyli 1.0 ;)

Nie uważam tej metody za dobrą, nie wiem czemu (może wygląda zbyt banalnie?), aczkolwiek póki działa nie będę rozpaczał :)

Brak komentarzy:

Prześlij komentarz

Jeżeli nie chcesz skorzystać z konkretnego profilu to zaznacz "Nazwa / adres URL" (wystarczy podać nazwę), bądź "Anonimowy"