開門見山
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)
可以看下這篇文章鏈接,文章有些內容錯誤,多注意下。