Jak komputery radzą sobie z liczbami zmiennoprzecinkowymi i zaokrąglaniem?
Wydawałoby się, że od komputera powinniśmy oczekiwać idealnej dokładności w obliczeniach. Niestety, sprawa nie jest tak bardzo oczywista jakby się wydawała. O tym w jaki sposób komputery radzą sobie z operacjami na liczbach zmiennoprzecinkowych i dlaczego dla komputera 0.1 + 0.2 = 0.3000..001.
- #
- #
- #
- #
- #
- #
- 84
Komentarze (84)
najlepsze
Najdroższy błąd w oprogramowaniu był właśnie związany z liczbami zmiennoprzecinkowymi. Sterowniki nawigacyjne rakiety Ariane 5 konwertowały 64 bitową liczbę zmiennoprzecinkową do 16 bitowego integera (bo moduł skopiowano z wersji 4, która była 16 bitowa). Przy konwersji powstawały więc błędy - liczba zapisana 64 bitowo po prostu nie mieści się cała w 16 bitach (pomijając konwersję typu która akurat działała ok) obcinanie wartości spowodowało więc, że po 37 sekundach nawigacja rakiety na
Z podobnych przypadków jest jeszcze:
25 lutego 1991 r - katastrofa w
Tak więc jak usłyszycie, że w ZUS giną pieniądze, to niekoniecznie muszą to być (ludzkie) przekręty ;)
bo jak dodali na nim 100 do 486, to wyszło 585,9999999998
Dodatkowo koleś mówi tylko o IEEE 754, który niekoniecznie musi być sposobem przechowywania liczb zmiennoprzecinkowych (ale raczej nie zdarza się inaczej, osobiście nie znam procesorów, które robią to inaczej).
Nawet była taka akcja, że pracownicy banku kradli te końcówki, i zanim się ktoś połapał to pokradli 800 000 USD.
@PunkT: wydaje mi się, że w Polsce nie ma takiego wymogu, chociaż nigdy nie miałam do czynienia z lokatami, więc
Pytanie do specjalistów - a nie ma u diabła systemu / układu / procesora liczącego jak ludzie, w układzie dziesiętnym, Base 10 czy jak to nazwać? Nie ma takiego układu cyfrowego stworzonego przez człowieka, dla którego naprawdę 0.1+0.2=0.3 bez żadnego kombinowania, obcinania i zaokrąglania?
Masz w sumie 3 możliwości:
1. Reprezentujesz liczbę binarnie poprzez notację wykładniczą czyli to o czym gość mówił i to co się spotyka w każdym komputerze
A 0.1+0.2=0.3 można osiągnąć bez większych problemów, np. zapisując liczby w postaci ułamków zwykłych, czy liczb całkowitych.
Po prostu jest to znacznie wolniejsze.
@bartoneczek: nie za bardzo rozumiem. Można cały czas operować na "decycelsjuszach", a przed samym wyświetleniem odpowiednio dzielić i odejmować, żeby dostać 3 wartości do wyświetlenia na wyświetlaczu segmentowym (co i tak byłoby konieczne, gdybym miał liczbę z przecinkiem).