c/c++ float和double的表示範圍詳細解析

開門見山

float範圍: 最小負數-2*2^127 最大負數-1*2^(-126),0
最小正數 1*2^(-126) 最大正數2*2^(127)。

double範圍: 負數:(-1.7976931348623157E+308,-4.94065645841246544E-324);
零:0 ;
正數:(4.94065645841246544E-324,1.7976931348623157E+308)。
即絕對值爲0和2^1022——2^1024。

精度:

  • float和double的精度是由尾數的位數來決定的;
  • 浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含着的“1”,由於它是不變的,故不能對精度造成影響;
  • float:2^23 =8388608,共七位,意味着最多能有7位有效數字,但絕對能保證的爲6位,也即float的精度爲6~7位有效數字;
  • double:2^52 = 4503599627370496,一共16位,同理,double的精度爲15~16位。

原因

float:1bit(符號位)+8bits(指數位)+23bits(尾數位);
double:1bit(符號位)+ 11bits(指數位)+ 52bits(尾數位)。
float爲例,階碼(指數)用移碼來表示,8位移碼(偏移量爲127) 本來應該可以表示-128-127,但是全0和全1被用來 表示特殊狀態的指數 ,所以爲-126-127(無符號8位表示0-255,去除全0和1後是1-254,減去偏移量127,就是-126-127)。 這裏爲什麼要使用127來作爲偏移量,若使用128 則8位移碼錶示範圍-127~126,由於表示一個大的正數 比一個小的負數更加重要,所以127作爲偏移量比較合適。 現在可以計算其表示範圍了: 尾數部分的取值範圍[1,2),所以最小負數-2*2^127 最大負數-1*2^(-126) 最小正數 1*2^(-126) 最大正數2*2^(127)

可以看下這篇文章鏈接,文章有些內容錯誤,多注意下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章