1 00:00:00,000 --> 00:00:00,310 2 00:00:00,310 --> 00:00:01,750 >> DAVID MALAN: Załóżmy teraz cios umysłu. 3 00:00:01,750 --> 00:00:06,500 Okazuje się, w prawdziwym świecie 1 podzielonej przez 10 rzeczywiście 1/10 lub 0,1. 4 00:00:06,500 --> 00:00:10,370 Ale tylko w komputerach, które mają skończone Liczba bitów o jakim 5 00:00:10,370 --> 00:00:14,290 oznaczają cyfry, nie może zawsze oznaczają numery, takie jak 1/10 z 6 00:00:14,290 --> 00:00:15,500 doskonała precyzja. 7 00:00:15,500 --> 00:00:18,640 Innymi słowy, komputerach czasem do połączeń wyroku i nie 8 00:00:18,640 --> 00:00:22,740 muszą odzwierciedlać numer, który chce tak dokładnie jak masz zamiar. 9 00:00:22,740 --> 00:00:27,020 >> Na przykład, załóżmy, że wracam do ten program i zmienić 0,1 do, 10 00:00:27,020 --> 00:00:32,073 O, 0,28, co wskazuje, że Chciałbym, aby printf do printf 11 00:00:32,073 --> 00:00:34,350 28 miejsc precyzji. 12 00:00:34,350 --> 00:00:39,330 Załóżmy teraz zapisać i skompilować program, tym razem z make floats2. 13 00:00:39,330 --> 00:00:41,910 Uruchom go dot slash floats2. 14 00:00:41,910 --> 00:00:49,980 I, drogi Boże, tym razem nie patrz 0.1, ale 0.10000000, co jest dość 15 00:00:49,980 --> 00:00:51,070 dobry do tej pory. 16 00:00:51,070 --> 00:00:57,830 Ale potem, 14901161193847656250. 17 00:00:57,830 --> 00:00:58,880 >> Cóż, to, co się dzieje? 18 00:00:58,880 --> 00:01:02,280 Cóż, okazuje się, że pływak jest zwykle przechowywany wewnątrz komputera 19 00:01:02,280 --> 00:01:03,500 z 32 bitów. 20 00:01:03,500 --> 00:01:07,340 32 jest oczywiście skończona liczba, która Oznacza to, że można reprezentować tylko 21 00:01:07,340 --> 00:01:11,050 z 32 bitów skończonej o wartości zmiennoprzecinkowe. 22 00:01:11,050 --> 00:01:14,980 Niestety, to znaczy, że Komputer nie może reprezentować wszystkie możliwe 23 00:01:14,980 --> 00:01:18,110 liczb zmiennoprzecinkowych lub liczby rzeczywiste, które istnieją w świecie 24 00:01:18,110 --> 00:01:19,980 ponieważ ma wiele bitów. 25 00:01:19,980 --> 00:01:23,940 >> I co z tego, że komputer jest najwyraźniej zrobione jest w tym przypadku stanowić 1/10 do 26 00:01:23,940 --> 00:01:26,880 najbliżej można zmiennoprzecinkowa Wartość punktu, że tak. 27 00:01:26,880 --> 00:01:31,050 Ale jeśli przyjrzymy się, jak my tu, do 28 miejsc po przecinku, zaczynamy widzieć, że 28 00:01:31,050 --> 00:01:31,970 brak precyzji. 29 00:01:31,970 --> 00:01:34,480 Więc to jest problem z nie idealne rozwiązanie. 30 00:01:34,480 --> 00:01:38,060 Możemy użyć double zamiast pływaka, która zmierza do stosowania 64 jako bity 31 00:01:38,060 --> 00:01:39,410 przeciwieństwie do 32. 32 00:01:39,410 --> 00:01:42,290 Oczywiście, 64 jest ograniczone, więc problem będzie 33 00:01:42,290 --> 00:01:43,630 pozostanie nawet z podwójnej. 34 00:01:43,630 --> 00:01:46,323