前面這篇博客 進制間的轉換 咱們已經講過了各個進制數的表示。如今咱們複習一下: html
進位計數制的要素:編程
①、數碼:用來表示進制數的元素。好比二進制數的數碼爲:0,1。十進制數的數碼爲:0,1,2,3,4,5,6,7,8,9。十六進制數的數碼爲:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F編程語言
②、基數:數碼的個數。好比二進制數的基數爲2。十進制數的基數爲10。十六進制數的基數爲 16.函數
③、位權:數制中每一固定位置對應的單位值稱爲位權。例如十進制第2位的位權爲101即10,第3位的位權爲102即100;而二進制第1位的位權爲20即1,第3位的位權爲4,對於 N進制數,整數部分第 i位的位權爲N(i-1),而小數部分第j位的位權爲N-j。編碼
那麼咱們能夠說:每一個數碼所表示的數值=該數碼值 * 所處位置的位權。spa
好比十進制數:(123.45)10=1×102+2×101+3×100+4×10-1+5×10-2htm
二進制數:(1010)2 =l× 23+0 × 22+l× 21+0 × 20=(10)10blog
十六進制數:(BAD)16 =11× 162+10×161+13×160=(2989)10ip
二進制小數(10010.1110)2 = 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8 get
總結來講
十進制表示公式:
對於一個形式爲bm....b0.b-1....b-n的二進制小數b來講,二進制表示公式:
從上面的二進制公式咱們能夠看出,小數點向左移動一位,則至關於 (∑ 2i * bi)/2。由於每一位的位權都*2-1;反過來,小數點向右移動一位,則至關於該數乘以2。
注意:二進制小數不像整數同樣,只要位數足夠,它就能夠表示全部整數。假設咱們僅考慮有限長度的編碼,那麼二進制小數沒法精確的表示任意小數,好比十進制小數0.2,咱們並不能將其準確的表示爲一個二進制數,只能增長二進制長度提升表示的精度。
IEEE,電氣和電子工程師協會( 全稱是Institute of Electrical and Electronics Engineers)是一個國際性的電子技術與信息科學工程師的協會,是目前全球最大的非營利性專業技術學會,IEEE 754 標準是IEEE二進位浮點數算術標準(IEEE Standard for Floating-Point Arithmetic)的標準編號。
IEEE 浮點標準表示: V = (-1)s * M * 2E 。
①、s 是符號位,爲0時表示正,爲1時表示負。
②、M爲尾數,是一個二進制小數,它的範圍是0至1-ε,或者1至2-ε(ε的值通常是2-k次方,其中設k > 0)
③、E爲階碼,可正可負,做用是給尾數加權。
咱們將浮點數的位劃分爲三個階段,分別對這些值進行編碼。
1、一個單獨的符號位 s 直接編碼符號 s
2、k 位的階碼字段 exp =ek-1ek-2...e1e0 編碼階碼E
3、n 位小數字段 frac = fn-1fn-2...f1f0 編碼尾數 M,可是編碼出來的值也依賴於階碼字段的值是否等於0.
通常來講,如今的編譯器都支持兩種浮點格式,一種是單精度,一種是雙精度。單雙精度分別對應於編程語言當中的float和double類型。其中float是單精度的,採用32位二進制表示,其中1位符號位,8位階碼以及23位尾數。double是雙精度的,採用64位二進制表示,其中1位符號位,11位階碼以及52位尾數。以下圖表示:
若是給定了位 s 的表示,根據 exp 的值,被編碼的值能夠分爲三種不一樣的狀況(最後一種狀況有兩個變種)。下圖是單精度的狀況:
下面咱們分別講解這三種狀況(規格化、非規格化、特殊值)
階碼E 的位模式exp既不全爲0(數值0),也不全爲1(單精度8位1,數值爲255,雙精度11位,數值爲2047)。
這種狀況下,階碼字段被解釋爲以偏置形式表示的有符號整數。」偏置」的含義就是在原有的值的基礎上加上一個偏移量,對於階碼位數爲k的狀況來講,偏移量Bias = 2k-1-1。假設e是階碼的無符號數值,那麼真實的階碼E = e - Bias。
單精度階碼位數爲8,則Bias = 127。因爲8位階碼下的規格化的浮點數的階碼範圍是1至254,所以真實階碼的範圍則爲-126至127。
對於小數字段 frac = fn-1fn-2...f1f0 它的值 0<= f < 1。那麼咱們能夠表示爲0. fn-1fn-2...f1f0,也就是二進制小數點在最高有效位的左邊。當計算浮點數數值的時候,會在尾數值的基礎上加1,也就是真實的尾數M = 1 + f。所以咱們能夠把 M 當作一個二進制表達式爲 1.fn-1fn-2...f1f0的數字。至關於咱們省掉了1位二進制,造成了浮點數表示的約定,默認尾數的值還有一個最高位的1。
12.5=1100.1=1.1001*2的3次方=0 10000010 1001 0000000000000000000 (浮點數)
一、首先,十進制轉二進制:
整數部分 除二餘數倒寫:
12: 12/2=6 餘0 ;6/2=3 餘0 ;3/2=1 餘1 ;1/2=0 餘1
倒寫 也就是:1100
小數部分 乘二取整順寫:
0.5: 0.5×2=1.0
取整 也就是:1
12.5的二進制:1100.1
二、而後將二進制轉化爲浮點數:
因爲12.5爲正數,因此符號位爲0;
1100.1=1.1001×2^3 指數爲3 ,
則 階碼=3+127=130 ,即:10000010
當階碼域爲全 0 的時候,所表示的數就是非規格化形式。
按照上面規格化的階碼求值方式來講,非規格化的階碼值應該固定在-Bias這個值上面。不過這裏有一個小技巧,咱們設定階碼的值E = 1 - Bias。這樣作是爲了可以平滑的從非規格化的浮點數過渡到規格化的浮點數,有關這一點後面咱們再詳細看。
對於尾數的解釋,非規格化的方式與規格化不一樣,它不會對尾數進行加1的處理,也就是說,真實的尾數M = f。這是爲了可以表示0這個數值,不然的話尾數老是大於1,那麼不管如何都將得不到0這個數值。
非規格化的浮點數除了能夠表示0之外,它還有一個做用,就是能夠表示接近於0的數值。另外,在浮點數當中,0的表示有兩種,一種是位表示所有爲0,則爲+0.0。還有一種則是符號位爲1,其他全爲0,此時爲-0.0。
特殊值是指階碼全爲 1 的時候出現的。
在階碼全爲1時,若是尾數位全爲0,則表示無窮大。符號位爲0則表示正無窮大,相反則表示負無窮大。假若尾數位不全爲0時,此時則表示NaN,表示不是一個數字。一些運算的結果不能是實數或者無窮,就會返回NaN值,好比正無窮減正無窮,-1的根號值。在某些應用中表示未初始化的值,也頗有用處。這一點在Javascript當中有一個函數isNaN()與這個NaN的含義有點相似,它的做用是用來判斷一個參數或者表達式是不是一個數字。
注意:因爲浮點數在正負的區間內是一一對應的,所以咱們將忽略符號位對取值範圍的影響,咱們只討論符號位爲0的狀況。
非規格化
①、最小的正非規格化值的位表示,是由最低有效位爲 1 而其餘全部位爲 0 構成。它具備小數(尾數)值 M=f=2-n 和階碼值 E= -2k-1+2。所以它的數字值是 V= 2-n * 22 - 2k-1 = 2-n+2 - 2k-1。
②、最大的非規格化值,全爲0的階碼字段和全爲1的小數字段組成。此時的小數(尾數)值 M=f=1-2-n,階碼 E= -2k-1 +2,所以此時的值爲 (1 - 2-n) * 22 - 2k-1。
規格化
①、最小的正規格化值,階碼字段的最低有效位爲1,其它位爲0,。它的尾數值 M = 1。階碼值 E= -2k-1 +2。所以數值 V = 22 - 2k-1
②、最大的規格化值,符號位爲0,階碼最低有效位等於0,其它位等於 1,尾數爲n個1。它的小數值 f=1-2-n,尾數 M= 2 - 2-n,此時的值爲(2 - 2-n) * 2-1 + 2k-1,也能夠化簡一下爲(1 - 2-n-1) * 22k-1。
下面咱們看一下非負浮點數單雙精度取值範圍: