>> DAVID MALAN: Załóżmy teraz cios umysłu.
Okazuje się, w prawdziwym świecie 1 podzielonej przez 10 rzeczywiście 1/10 lub 0,1.
Ale tylko w komputerach, które mają skończone Liczba bitów o jakim
oznaczają cyfry, nie może zawsze oznaczają numery, takie jak 1/10 z
doskonała precyzja.
Innymi słowy, komputerach czasem do połączeń wyroku i nie
muszą odzwierciedlać numer, który chce tak dokładnie jak masz zamiar.
>> Na przykład, załóżmy, że wracam do ten program i zmienić 0,1 do,
O, 0,28, co wskazuje, że Chciałbym, aby printf do printf
28 miejsc precyzji.
Załóżmy teraz zapisać i skompilować program, tym razem z make floats2.
Uruchom go dot slash floats2.
I, drogi Boże, tym razem nie patrz 0.1, ale 0.10000000, co jest dość
dobry do tej pory.
Ale potem, 14901161193847656250.
>> Cóż, to, co się dzieje?
Cóż, okazuje się, że pływak jest zwykle przechowywany wewnątrz komputera
z 32 bitów.
32 jest oczywiście skończona liczba, która Oznacza to, że można reprezentować tylko
z 32 bitów skończonej o wartości zmiennoprzecinkowe.
Niestety, to znaczy, że Komputer nie może reprezentować wszystkie możliwe
liczb zmiennoprzecinkowych lub liczby rzeczywiste, które istnieją w świecie
ponieważ ma wiele bitów.
>> I co z tego, że komputer jest najwyraźniej zrobione jest w tym przypadku stanowić 1/10 do
najbliżej można zmiennoprzecinkowa Wartość punktu, że tak.
Ale jeśli przyjrzymy się, jak my tu, do 28 miejsc po przecinku, zaczynamy widzieć, że
brak precyzji.
Więc to jest problem z nie idealne rozwiązanie.
Możemy użyć double zamiast pływaka, która zmierza do stosowania 64 jako bity
przeciwieństwie do 32.
Oczywiście, 64 jest ograniczone, więc problem będzie
pozostanie nawet z podwójnej.