[六]基礎數據類型之浮點數簡介

Java中,基本數據float 和double的包裝類Float和Double都是浮點類型spa

因此對於浮點數在計算機中的表示方法須要有一個基本瞭解,不然很難了解清楚Float和Double的實現原理3d

本文對計算機中的浮點數表示IEEE754標準,進行了簡單介紹blog

浮點數的表示

IEEE754 標準
image_5bbabe67_7d45[4]
   image
 
 
由於指數有正有負,指數位中咱們就要拿出第一位來指示符號,可是處理起來會不方便
因此給指數的真值 加上 指數偏移值 ,就能保證結果老是一個非負數  
標準規定
指數偏移值爲  2(e−1) -1  e爲指數的位數
單精度  指數偏移值爲127     對於雙精度  指數偏移值爲1023  
指數無符號數表示的範圍
單精度8位   0~255
雙精度11位 0~2047
指數真值也就是實際的值
單精度 -127 ~ 128
雙精度 -1022 ~ 1023
不過頭尾 被保留, 會另作他用 ,下面會繼續說明
因此實際的值要去掉頭尾,也就是
單精度 -126 ~ 127
雙精度 -1022 ~ 1023

規範化形式

綜上,一個實數在計算機中表示形式爲:
image_5bbabe67_6cc7[4]
sign  s          符號位
exponent     指數部分
fraction        尾數部分
按照咱們上面講的,指數真值也就是實際的值
單精度 -127 ~ 128
雙精度 -1022 ~ 1023
也就是不包括頭尾, 也就是指數部分不包括 指數全是0 (0) 或者全是1(255)的狀況 
這就是規範化形式,對於規範化形式,表示的數值以下
 
S = 符號位
M=1.f
E=指數值-指數偏移值
表示的數值爲:
image
這是浮點數的規範化表示形式
S表示符號位
尾數部分前隱含一個小數點,小數點前隱含一個1
指數的真值E 也就是 指數部分表示的無符號數減掉指數偏移值

取值範圍

單精度

單精度指數的範圍(指數 - 指數偏移值以後的值 )  爲:
-126 ~ 127
正數最大值
指數爲正數的最大值 127
尾數 也爲最大值 所有都是1  也就是23個1
(-1)0  × 1.11111...(23個1)  × 2127
 
也就是
(2−2−23)×2127
 
1.11111...(23個1)  = 20 +2-1 +2-2 + ....2-23
 
image_5bbabe67_3c0f[4]
 
公比 q= 1/2    a1 = 20
代入公式 
image_5bbabe67_1a7e[4]
正數最小值
指數爲負數的最小值 -126
尾數 也爲最小值, 所有都是0  也就是23個0
1.0  ×  2-126

 

雙精度

雙精度指數的範圍(指數 - 指數偏移值以後的值 )  爲:
-1022 ~ 1023
正數最大值
指數爲正數的最大值 1023
尾數 也爲最大值 所有都是1  也就是52個1
(-1)0  * 1.11111...(52個1)  * 21023 
也就是
(2−2−52)×21023   (仍是等比數列求和)
正數最小值
指數爲負數的最小值 -1022
尾數 也爲最小值, 所有都是0  也就是52個0
1.0 × 2-1022  

非標準化形式

試想,對於單精度 1.001×2−125  和1.01×2−125, 它們的差值是0.001×2−125=1.0×2−128
兩個數值之間的差小於可以表示的最小值
也就意味着兩個不相等的數進行減法運算,將會瞬間下溢, 獲得的結果將會是0
其實這就是精度不夠的問題
因此又規定了非標準化形式
那麼怎麼區分何時是標準何時是非標準呢? 就是使用保留的指數的取值範圍 
對於指數部分,若是全部的比特位全都是0 ,那麼這就是一個非標準化形式
在非標準化狀況下,尾數部分以前有隱含的小數點, 可是小數點以前,隱含的不在是1 而是0 
對於指數的真值,再也不是指數部分表示的無符號數減掉指數偏移量
一旦指數部分爲0  (也就是全部的比特位都是0),這就是一個標記符號了,再也不有指數大小的含義
這種狀況下 
指數的真值爲  1 - 指數偏移量
單精度爲 1-127= -126
雙精度爲 1-1023 = -1022
單精度  (−1)s ×  (0.f)  ×  2-126  
雙精度  (−1)s ×  (0.f)  ×  2-1022

 

取值範圍

很顯然,對於非標準化形式來講,指數的真值變成了固定值
想要得到正數的最小值,只須要最後一位爲1 其餘全部的尾數部分全都是0便可
單精度 0.0000...1(23位,最後一位爲1)  ×  2-126   =  2-23 ×  2-126  2-149 
雙精度 0.0000...1(52位,最後一位爲1)  ×  2-1022 = 2-52 ×   2-1022 = 2-1074 

 

特殊值

指數部分表示的無符號數,頭尾被保留,用於表示一些特別的含義
對於標準化形式,指數部分 既不是全0  也不是全1
非標準化狀況下,指數部分爲全0

當指數部分中全部bit的值全是1,f中全部bit的值全是0,表示無窮大
根據符號位來區分正無窮和負無窮
當指數部分中全部bit的值全是1,f中全部bit的值不全是0  表示NaN(Not a Number)
若是 指數 是0 而且 小數部分 是0, 這個數是0 根據符號位區分+0  和  -0
相關文章
相關標籤/搜索