為什麼浮點數表示範圍更大?1、什麼是浮點數?我們知道,數學中并沒有浮點數的概念,雖然小數看起來像浮點數,但從不這麼叫那為什麼計算機中不叫小數而叫浮點數呢?,我來為大家科普一下關于為什麼浮點數表示範圍更大?以下内容希望對你有幫助!
為什麼浮點數表示範圍更大
1、什麼是浮點數?
我們知道,數學中并沒有浮點數的概念,雖然小數看起來像浮點數,但從不這麼叫。那為什麼計算機中不叫小數而叫浮點數呢?
因為資源的限制,數學中的小數無法直接在計算機中準确表示,為了更好地表示它,計算機科學家們發明了浮點數,這是對小數的近似表示。
2、IEEE754是什麼?
知道了浮點數的概念,但需要确定一套具體的表示、運算标準,其中最有名的就是IEEE754标準。
本文的讨論都基于IEEE754标準,這也是目前各大編程語言和硬件使用的标準。
3、浮點數的構成
浮點數是指用符号、尾數、基數和指數這四部分來表示的小數。
浮點數
根據浮點數的組成,因為是在計算機中表示浮點數,基數自然是2(不存儲),因此IEEE754浮點數隻關注符号、尾數和指數三部分。
浮點數在計算機中的存儲方式遵循IEEE754浮點數計數标準,可以表示為:
浮點數
類似于數學課本上所學的科學計數法表示方式:有效數字 指數位。
因此,隻要給出:符号(S)、階碼部分(E)、尾數部分(M)這三個信息,一個浮點數的表示就确定下來了。一般IEEE754浮點數有兩種類型,單精度浮點數(float)和雙精度浮點數(double),還有其他的,不常用。單精度浮點數使用4字節表示,雙精度浮點數使用8字節表示。所以float和double這兩種類型的浮點數在計算機中的存儲結構如下圖:
單精度浮點數
雙精度浮點數
符号位:0表示正數,1表示負數。
階碼部分(指數部分):對于float型浮點數,指數部分8位,我們知道,在十進制的科學計數法中,指數可以是負數,而計算機存儲浮點數的“指數部分”又是一個無符号的整數,因此,IEEE754标準規定,指數必須減去一個偏移值而得到真實的“指數值”。
偏移值的計算公式:2^(e-1) -1, e為階碼(指數)的位數,即為8,因此偏移值是2^(8-1) -1=127。
IEEE754規定,2^(e-1) -1的值是 0,小于這個值表示負數,大于這個值表示正數。因此,對于單精度浮點數而言, 2⁸⁻¹-1= 127 是 0;雙精度浮點數,2¹¹⁻¹-1 = 1023 是 0。
沒看懂?舉個栗子。
比如十進制數 0.15625,轉為二進制是 0.00101。為了讓第 1 位為 1,執行邏輯右移 3 位,尾數部分成為 1.01,因為右移了 3 位,所以指數部分是 -3。
根據 IEEE754 的定義,單精度浮點數情況下,-3 的實際值是 127 - 3 = 124。明白了嗎?127 表示 0,124 就表示 -3 了。
如果你還不理解,想想這個問題。
如果讓你用撲克牌(A ~ K,也就是 1 ~ 13)來表示支持負數的。怎麼辦?我們會選擇一個中間的數,比如 7 當做 0,因此 10 就是 3,4 就是 -3。現在理解了吧!
那為什麼單精度浮點數指數偏移值是127呢?
由于篇幅有限,這個留給大家自行查找資料。
尾數部分:浮點數的名稱由來在于小數點的位置是浮動的,比如 7.5x10、0.75 x10² 等表示法,值一樣,但小數點位置不一樣。在具體存儲時,需要固定一種形式,這叫做尾數的标準化。
IEEE754 規定,在二進制數中,通過移位,将小數點前面的值固定為 1。IEEE754 稱這種形式的浮點數為規範化浮點數。
因為IEEE754規定第 1 位永遠為 1,因此可以省略不存。
對于float型浮點數,尾數部分23位,換算成十進制就是2^23=8388608,所以十進制精度最多7位。
4、實例講解
講解之前先熟悉一下進制轉換:
二進制轉十進制
和整數轉換一樣,采用各位數值和位權相乘。比如:
(0.101)₂ = 1×2⁻¹ 0×2⁻² 1×2⁻³ = (0.625)₁₀
記住小數點後第一位是從 -1 開始即可。
十進制轉二進制
十進制整數轉二進制采用“除 2 取餘,逆序排列”法。例如十進制數 11 轉為二進制:
11/2=5 … 餘1
5/2=2 … 餘1
2/2=1 … 餘0
1/2=0 … 餘1 (1除以2不夠除,也就是商為0,餘數為1-0=1)
所以 (11)₁₀ 的二進制是 (1011)₂
但如果十進制是小數,轉為二進制小數如何做?
采用“乘 2 取整,順序排列”。讓小數一直乘2,小于1則用結果繼續乘,大于1則用結果減1繼續乘,等于1則結束。
例如十進制小數 0.625 轉為二進制小數:
0.625*2=1.25 … 取整數部分1
0.25*2=0.5 … 取整數部分0
0.5*2=1 … 取整數部分1
順序排列,所以 (0.625)₁₀ = (0.101)₂
如果一直不能等于1怎麼辦,會有什麼影響?
暫且擱置不講。
開始講解實例:例如 178.125
1、分别把浮點數的整數部分和小數部分轉換成2進制。
整數部分:
178/2=89 … 餘0
89/2=44 … 餘1
44/2=22 … 餘0
22/2=11 … 餘0
11/2=5 … 餘1
5/2=2 … 餘1
2/2=1 … 餘0
1/2=0 … 餘1
逆序排列,所以 (178)₁₀ 的二進制是 (10110010)₂
小數部分:
0.125*2=0.25 … 取整數部分0
0.25*2=0.5 … 取整數部分0
0.5*2=1 … 取整數部分1
順序排列,所以 (0.125)₁₀ = (0.001)₂
合起來即是:10110010.001
2、轉換成計算機存儲形式的二進制浮點數
把小數點移動到整數位隻有1,即為:1.0110010001*2^111,111是二進制,換算成十進制為7,由于左移了7位,所以是111。
3、階碼(指數)
階碼(指數)的計算公式:階數(指數) 偏移量(單精度浮點數指數偏移值是127)
即:111 01111111=10000110 (7 127=134)
4、尾數
小數點後面的數,即0110010001
小數點前面的1去哪裡了?由于尾數部分是規格化表示的,最高位總是1,所以省略不存。這樣尾數部分多了 1 位,提高了精度。
5、符号位
由于浮點數是正數,故為0(負數為1)
6、結果
最終結果為:
(178.125)₁₀ = (01000011001100100010000000000000)₂
單精度浮點數為32位,不夠32位後面補0。
0為什麼補在後面?
因為是尾數部分,補在後面比補在前面對實際數值影響比較小。
(178.125)₁₀ = (01000011001100100010000000000000)₂
2進制轉換16進制如下:
0100 4
0011 3
0011 3
0010 2
0010 2
0000 0
0000 0
0000 0
16進制為43322000
參考了網絡上有關浮點數轉換的文章,加上個人的理解,整理成文!
如有侵權,請告知!謝謝!