將0.1累加100次也得不到10
我們來一個計算機運算錯誤的例子。
function sum(){
let sum = 0;
for(let i=1;i<=100;i++){
sum +=0.1;
}
console.log(sum)
}
我們在瀏覽器的控制臺中,運行sum(),得到的運行結果為9.99999999999998。這顯然和我們的九年義務教育所教導的 「背道而馳」 。
有句話說, 「雪崩的時候,沒有一片雪花是無辜的」 。在這段代碼中,程序沒錯,計算機也沒有發(fā)生故障,當然和所使用的語言也沒有關系(選用其他的高級語言可能運算結果不同)。如果硬要找一個背鍋的,那就是 「計算機處理小數(shù)的機制」 。
用二進制數(shù)表示小數(shù)
在計算機底層知識之二進制中我們講過,由于計算機內(nèi)部所有的信息都是以二進制數(shù)的形式來處理,因此, 「整數(shù)和小數(shù)并無差別」 。
在說明計算機如何用二進制數(shù)表示小數(shù)的具體方法前,我們先嘗試將1011.0011這個有小數(shù)點的二進制數(shù)轉(zhuǎn)換成十進制數(shù)。
小數(shù)點 「前面」 部分的轉(zhuǎn)換方法在計算機底層知識之二進制中介紹過。只需將各 「數(shù)位」 數(shù)值和 「位權」 相乘,然后再將相乘的結果相加即可實現(xiàn)。其實,針對小數(shù)點后面的部分,也是 「照貓畫虎」 ,也是將各 「數(shù)位」 數(shù)值和 「位權」 相乘的結果相加即可。

二進制數(shù)小數(shù)轉(zhuǎn)換成十進制數(shù)
二進制數(shù)小數(shù)點前面部分的**「位權」**
- 第一位是
2的0次冪 - 第二位是
2的1次冪 - 第三位是
2的2次冪 - 以此類推
而小數(shù)點后面部分的**「位權」**
- 第一位是
2的-1次冪 - 第二位是
2的-2次冪 - 第三位是
2的-3次冪 - 以此類推
?0次冪前面的位的位權按照
1次冪、2次冪····的方式**「遞增」**0次冪后面的位的位權按照
-1次冪、-2次冪····的方式**「遞減」**?
計算機運算出錯的原因
?計算機運算出錯的原因:「有一些十進制數(shù)的小數(shù)無法轉(zhuǎn)換成二進制」
?
小數(shù)點后4位用二進制數(shù)表示時的數(shù)值范圍為0.0000~0.1111。這里只能表示0.5、0.24、0.125、0.0625這四個二進制數(shù)小數(shù)點后面的位權組合而成(相加總和)的小數(shù)。

?可以看出:「二進制數(shù)是連續(xù)的,十進制數(shù)是非連續(xù)的」
?
在前面講二進制的時候,我們說,根據(jù)IC引腳個數(shù)不同,我們可以表示位數(shù)不同的二進制數(shù)。我們可以通過增加引腳數(shù),也就是增加二進制小數(shù)點后面的位數(shù),與其相對應的十進制數(shù)的個數(shù)也會增加, 「但是不管增加多少位,2的-〇〇次冪怎么相加都無法得到0.1這個結果」 。
實際上,十進制數(shù)0.1轉(zhuǎn)換成二進制后,會變成0.00011001100···(1100循環(huán))這樣的 「循環(huán)小數(shù)」 。這和用十進制數(shù)來表示1/3是一樣的道理。
?計算機這個 「功能有限」 的機器設備,是無法處理 「無限循環(huán)」 的小數(shù)的
?
因此,在遇到 「循環(huán)小數(shù)」 時,計算機就會根據(jù) 「變量數(shù)據(jù)類型」 所對應的長度將數(shù)值從 「中間截斷」 或者 「四舍五入」 。
然后,我們再結合我們上面的例子,一個 「循環(huán)小數(shù)」 在進行存儲的時候,已經(jīng)被 「掐頭去尾」 ,而偏偏針對這個值,又進行了N多次處理。不怕你不努力,就怕你,持之以恒的向偏離既定軌道的方向上移動,那么結果可想而知,是永遠不會達到最終想要的結果。
浮點數(shù)
像1011.0011這樣帶小數(shù)點的表現(xiàn)形式,在計算機內(nèi)部是無法使用的。
很多編程語言中都提供了兩種表示小數(shù)的數(shù)據(jù)類型,分別是 「雙精度浮點數(shù)」 和 「單精度浮點數(shù)」 。
- 「雙精度浮點數(shù)」 用
64位表示小數(shù) - 「單精度浮點數(shù)」 用
32位表示小數(shù)
「浮點數(shù)」 是指用 「符號」 、 「尾數(shù)」 、 「基數(shù)」 和 「指數(shù)」 這四部分表示的小數(shù)。

?計算機內(nèi)部使用的是二進制數(shù),所以 「基數(shù)是2」 ,因此,實際的數(shù)據(jù)中往往不考慮基數(shù)。只用 「符號」 、 「尾數(shù)」 、 「指數(shù)」 這三部分就可以表示 「浮點數(shù)」 。
?
浮點數(shù)表現(xiàn)形式
浮點數(shù)的表現(xiàn)方式有很多中,我們采用IEEE標準來解釋。

雙精度浮點數(shù)和單精度浮點數(shù)在表示同一個數(shù)值時 「使用的位數(shù)」 不同。
「符號部分」 是指使用一個 「數(shù)據(jù)位」 來表示符號。「數(shù)據(jù)位是1時表示負,為0時表示正或者0」
?數(shù)值的大小用 「尾數(shù)部分」 和 「指數(shù)部分」 來表示。即用 「尾數(shù)部分 × 2的指數(shù)部分次冪」 的形式來表示。
?
- 「尾數(shù)部分」 用的是**「將小數(shù)點前面的值固定為1的正則表達式」**
- 「指數(shù)部分」 用的是**「EXCESS系統(tǒng)表示」**
-
計算機
+關注
關注
19文章
7841瀏覽量
93460 -
程序
+關注
關注
117文章
3848瀏覽量
85467 -
代碼
+關注
關注
30文章
4976瀏覽量
74376
發(fā)布評論請先 登錄
計算機組成原理基礎知識
計算機網(wǎng)絡基礎知識了解
計算機的基礎知識
計算機應用基礎課件
計算機基礎知識選擇題
計算機總線技術基礎知識
計算機測控系統(tǒng)與操作系統(tǒng)概述集合【labview基礎知識】
計算機控制技術的基礎知識點說明
圖像處理基礎知識 1
計算機基礎知識之處理小數(shù)2
計算機基礎知識之處理小數(shù)1
評論