定點數與浮點數 小數

2021-09-11 06:17:08 字數 4211 閱讀 9286

一、計算機中一共有兩種機器數型別:

機器數就是計算機中參與運算的有符號二進位制數,其實,它與我們平時使用的十進位制一樣,有整數也有小數,但是關鍵在於,如果二進位制與我們平時書寫十進位制小數一樣,帶上乙個".",那麼二進位制受困於儲存器中字長的限制,無法靈活地表示小數的小數點("."),所以,二進位制的小數在儲存器中的表示形式與我們平時書寫的十進位制數時不一樣,需要對小數點進行特別的處理,這也就有了我們接下來將要重點介紹的"定點數"與"浮點數"之分。

–引用自王達老師《深入理解計算機網路》一書

你可以先思考一下,為什麼帶上".",二進位制會受困於儲存器中字長的限制,導致無法靈活地表示浮點數(小數)呢?

解釋:這是乙個很古老的故事了,因為,機器只能認識0,1兩種表示,那麼,你如果想在機器中表示".",要麼用0,要麼用1,比如:

十進位制的3.1,假設我們用0來表示這個".",那麼3.1轉換成二進位制就是011 0 00011,這裡有兩個非常巨大的漏洞,首先,011000011也是十進位制數195的二進位制表示,那麼計算機無法辨別到底是195還是3.1,其次,就算能用0來表示".",那麼011之後有4個0,到底第幾個0才是表示那個小數點的0?所以,用0表示小數點不行,那麼用1表示呢?用1也不行,和用0表示缺點是一樣的。

那麼我們是否能規定字長中的第幾位是表示小數點?可以,比如我們規定字長為64位的儲存器中的第32位為小數點,那麼,這就損失了靈活性,因為,你既然規定了第32位為小數點,這是固定不變的,那麼第一位肯定是符號位了,所以表示整數部分的位數只剩下了第2位到第31位,表示小數部分的位數只剩下了第33位到第64位(小數點左邊是整數部分,右邊是小數部分),既然規定了位數,那麼這個定長所能表示的數值範圍就極大受限了,從以上分析來看,二進位制無法像十進位制那樣通過"."直觀表示乙個浮點數,那麼怎麼樣來表示乙個浮點數合適呢?文章"浮點數"章節會詳細說明。

整數型別的機器數很好表示,只是在最高位多了乙個符號位,小數點總是在最右端,完全可以直接忽略,就像我們書寫十進位制整數時一樣,但如果是小數,小數點是不能不考慮的,上文提到了,在計算機中,".「不像我們平常書寫十進位制那樣好處理,因為為了保持靈活性,不可能在計算機的儲存器裡面固定拿一位出來表示」.",所以,計算機的儲存器是沒有專門的位來表示小數點的。

為了能使計算機自動識別機器數的小數點位置,正確識別對應機器數的大小,依據機器數中小數點的位置是否固定把所有的機器數分為兩類:定點數和浮點數(之所以叫浮點數,其實是很形象的,因為小數點在不同的浮點數之間總是"浮來浮去",不是固定的)。

–引用自王達老師《深入理解計算機網路》一書

2、浮點數

我在上文中已經分析了,計算機中二進位制如果要表示即有整數又有小數的定點數(這裡稱為定點數的意思就是在儲存器中固定一位,讓它表示".")不可能像書寫十進位制小數那樣方便(意思就是表示中不可能包括"."),實際上的解決辦法還是需要通過0和1來表示,但是表示方法需要換一下,說直白一些,我們實際使用的表示即有整數又有小數的二進位制表示法不包括".",計算機可以通過實際的表示確定小數點的具體位置,其實就是"浮點數法"–這種表示法很靈活,可以表示任何小數,同時也充分利用的計算機的字長,表示的範圍也比定點法擴大好多倍,實際應用起來沒有一點問題。

這裡通過實際的舉例來說明"浮點",比如12.23中".「是在第3位,1.223中」.「是在第2位,1099.25中」.「是在第5位,看上去,不同的數中這個」.「是不是位置不同,浮來浮去的?所以我們很形象地把實際中用來表示即有整數部分又有小數部分的定點數的表示法稱為"浮點」。於是乎,即有整數部分又有小數部分的數直接就稱為"浮點數"了。

那麼,計算機中是如何靈活地來表示乙個浮點數的呢?

我們知道,在十進位制數中,比如123.45用科學計數法可以表達為1.2345 * 22,其中1,2345為尾數,10為進製基數,2為指數,尾數和指數均為十進位制表示,如果是負數,在前面加乙個"-「就行。

如果需要將以上內容整理成乙個通式表達的話,尾數用m表示,指數用e表示,那麼十進位制數n的表達通式是:

n = m * 10e;

按照以上的思路可以得出二進位制的表達通式為:

n = m * 2e(只需要換進製基數就行,將10換成2)。

但是二進位制的表達通式中,尾數m必須是二進位制原碼格式,指數e也必須是二進位制原碼格式,e在十進位制中稱"指數」,但是在二進位制通式中稱為"階碼"(ieee 754中是用移碼表示)。

最後一點需要強調的是,浮點數在計算機儲存器中儲存的格式可以是原碼格式,也可以是補碼格式,但通常都是補碼格式,因為補碼格式方便正負數的運算。

我們再來仔細觀察一下這個表達通式:

:n = m * 2e

之前直接在儲存器中像儲存十進位制小數一樣儲存二進位制浮點數的方式已經被證明不靈活以及非常受限。那麼還有什麼辦法?

通過再次對以上通式的觀察,我們可以發現,乙個浮點數只要知道了它的符號位,指數和尾數,就可以根據以上的通式反推出它的實際值,所以最終的解決辦法就是在儲存器中分別存數浮點數的符號位,指數字和尾數字,不同的標準對符號位,指數字和尾數為規定的儲存位數不同,我們來討論ieee 754標準。

通過**圖示符號位(s),指數(e),尾數(m)的儲存順序:

符號位 s

指數字 e

尾數字 m

指數字e的形式實際上就是乙個定點整數(純整數),可以通過它推算出浮點數的小數點位置,所以它也間接決定了浮點數的表示範圍,m的形式實際上就是乙個定點小數(純小數),它表示了浮點數的有效值,決定了浮點數的精度(精度說白了就是小數點保留幾位)。指數e為正時,表示轉換後尾數部分的小數點比原數的小數點位置左移了e位(用十進位制舉例,更直觀,比如123.4變成1.234 * 102,那麼1.234的小數點相比123.4左移了2位,二進位制也是乙個意思,只是進製基數為2),指數e為負時,表示轉換後尾數部分的小數點與原數的小數點位置右移了e位。

如乙個浮點數為-0.10101 * 211,則它在16位字長的儲存器(假設規定e用4位表示,m用11位表示,s符號位佔1位)中的儲存格式如下**:

符號位 s

指數字 e

尾數字 m

10011

10101000000

通過以上的分析,我們發現了,實際上所有的浮點數都可以通過移動小數點來變成乙個純小數和乙個指數的乘積,同時,為了規範起見,規定機器數的浮點數表達形式中尾數的最高有效位(即小數點右邊第一位)不能為0,必須為1,也就是說,不要出現0.00101001 * 2101101這種情況!

把所有不滿足小數點右邊第一位必須為1的浮點數變成滿足要求格式的過程稱為浮點數的規格化處理(實際上就是通過小數點的以為和修改指數來實現)。

在ieee 754標準中,把浮點數分成了單精度和雙精度兩種,同時規定了單精度浮點數長度為32位(4位元組),雙精度浮點數為64位(8位元組)。

ieee 754標準中,e和m都是用補碼表示,而不是原碼,因為補碼方便計算。

這裡又有乙個問題需要說明,我們都知道,指數e是可以為負的,這樣可能導致乙個浮點數**現兩個符號位(浮點數自身和浮點數指數的),這樣的結果會導致在比較兩個浮點數大小時比較麻煩,那麼這種問題如何解決呢?

實際中的解決辦法是,可以在指數的基礎上加上乙個固定的正數(這個正數是無符號的正數,就是說,它所有的二進位制位都是它的真值,它沒有符號位!),保證指數一定是正的(加的這個正數是固定的)!這種操作在ieee 754中稱為偏移,得到的結果稱為"移碼"。所以,用移碼表示能確保指數部分均為無符號的正數,正數的原碼和補碼完全一致,不用轉換。

下表提供單精度浮點數和雙精度浮點數各部分在儲存器中的結構

浮點數型別

符號所在位(s)

指數所在位(e)

尾數所在位(m)

偏移值(固定的正數)

單精度浮點數

31(1)

30-23(8)

22-0(23)

127(對應二進位制位:01111111)

雙精度浮點數

63(1)

62-52(11)

51-0(52)

1023(對應二進位制位:0111111111)

以上表中的指數e是以"移碼"格式表示的,所以ieee 754 中用於浮點數中小數點位置的移碼 = 原指數 + 偏移值。如果用e來表示原來的指數,則有如下關係式:

e = e + 偏移值

總結:在計算浮點數時可以用以下公式統一表示:x = s(1.m) * 2e-偏移值,其中x為浮點數原碼,s為符號位,m為尾數,e為移碼表示,"e-偏移值"就等於原指數。

ps:可能有的人會異或,為什麼是1.m。因為這是格式化,所有的浮點數都可以通過移動指數來格式化,比如二進位制的0.1 = 1.0 * 2-1,0.00101 = 1.01 * 2-3。統一了格式便於理解和計算!

在此,再次感謝王達老師的《深入理解計算機網路》一書對本文的啟發!

定點數與浮點數

1 定點數 定點數指小數點在數中的位置是固定不變的,通常有定點整數和定點小數。在對小數點位置作出選擇之後,運算中的所有數均應統一為定點整數或定點小數,在運算中不再考慮小數問題。1 定義 資料中小數點位置固定不變的數 2 種類 定點整數 3 小數點在符號位與有效位之間。注 定點數受字長的限制,超出範圍...

定點數與浮點數

dsp中對數值的儲存方式有兩種 定點表示法和浮點表示法 對應dsp晶元分為兩種 定點dsp晶元和浮點dsp晶元 定點dsp晶元 結構簡單,mac速度較快,運算精度低,動態範圍小 浮點dsp晶元 結構較複雜,主頻較低,功耗較高,動態範圍大 1 定點資料格式 fixed point 1.1定點整數 定點...

定點數與浮點數

小數點固定在某一位置的數為定點數,採用定點數的機器稱為定點機,有以下兩者格式 小數點位於數符和第一數值位之間時,機器內的數為純小數 小數點位於數值位之後時,機器內的數為純整數 在定點機中,由於小數點的位置固定不變,故當機器處理的數不是純小數或純整數時,必須乘上比例因子,否則會產生 溢位 這似乎有點麻...