1 00:00:00,000 --> 00:00:00,310 2 00:00:00,310 --> 00:00:01,750 >> DAVID馬蘭:現在,讓我們打擊你的頭腦。 3 00:00:01,750 --> 00:00:06,500 原來,在現實世界中1分 10的確1/10,或0.1。 4 00:00:06,500 --> 00:00:10,370 但在計算機只具有有限的 位,用以號 5 00:00:10,370 --> 00:00:14,290 代表數字,你不能總是 表示相同的1/10號與 6 00:00:14,290 --> 00:00:15,500 完美的精確度。 7 00:00:15,500 --> 00:00:18,640 換句話說,計算機有時有 作出判斷來電和未 8 00:00:18,640 --> 00:00:22,740 一定代表你數 想為你打算盡可能準確。 9 00:00:22,740 --> 00:00:27,020 >> 例如,假設我回去成 這個程序並更改為0.1, 10 00:00:27,020 --> 00:00:32,073 哦,0.28,從而表明 我想的printf對printf到 11 00:00:32,073 --> 00:00:34,350 28位的精度。 12 00:00:34,350 --> 00:00:39,330 現在讓我們保存和編譯程序, 這個時候用make floats2。 13 00:00:39,330 --> 00:00:41,910 用點斜線floats2運行它。 14 00:00:41,910 --> 00:00:49,980 而且,親愛的上帝,這次我看到的不是0.1, 但0.10000000,這是非常 15 00:00:49,980 --> 00:00:51,070 好為止。 16 00:00:51,070 --> 00:00:57,830 但隨後,14901161193847656250。 17 00:00:57,830 --> 00:00:58,880 >> 那麼,這是怎麼回事? 18 00:00:58,880 --> 00:01:02,280 嗯,事實證明,一個是浮動 通常存儲在計算機的內部 19 00:01:02,280 --> 00:01:03,500 與32位。 20 00:01:03,500 --> 00:01:07,340 32顯然是一個有限的數字,這 意味著你只能代表 21 00:01:07,340 --> 00:01:11,050 由32比特的有限數 的浮點值。 22 00:01:11,050 --> 00:01:14,980 不幸的是,這意味著該 電腦不能代表所有可能的 23 00:01:14,980 --> 00:01:18,110 浮點數或實數, 存在於世界各地, 24 00:01:18,110 --> 00:01:19,980 因為它只有這麼多的位。 25 00:01:19,980 --> 00:01:23,940 >> 還等什麼電腦是顯然 在這種情況下所做的是代表1/10至 26 00:01:23,940 --> 00:01:26,880 最接近的可能浮動 點值,它可以。 27 00:01:26,880 --> 00:01:31,050 但是,如果我們看看,因為我們這裡有,到28 小數位,我們開始看到, 28 00:01:31,050 --> 00:01:31,970 不精確。 29 00:01:31,970 --> 00:01:34,480 因此,這是一個問題 沒有完美的解決方案。 30 00:01:34,480 --> 00:01:38,060 我們可以用一個雙而非浮動, 這往往要使用64比特作為 31 00:01:38,060 --> 00:01:39,410 置為32。 32 00:01:39,410 --> 00:01:42,290 但是,當然,64也是有限的, 所以這個問題會 33 00:01:42,290 --> 00:01:43,630 即使雙打依然存在。 34 00:01:43,630 --> 00:01:46,323