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"