單精度浮點數float32和雙精度浮點數float64的二進制表示方法類似,以float64爲例,二進制位如圖html
sign bit(符號): 用來表示正負號,0表明數值爲正,1表明數值爲負。spa
exponent(指數): 用來表示次方數htm
mantissa(尾數): 用來表示精確度blog
一個雙精度浮點數所表明的數值爲:(-1)sign × 2exponent - 0x3ff × 1.mantissaget
0 ≤ exponent ≤ 0x7ff,- 0x3ff 稱爲偏正值,使指數便可正亦可負。it
爲何不用符號位1bit + 數值位10bit表示形式呢?io
答:爲了簡化比較。由於,指數的值可能爲正也可能爲負,若是採用補碼表示的話,全體符號位S和Exp自身的符號位將致使不能簡單的進行大小比較。正由於如此,指數部分一般採用一個無符號的正數值存儲table
sign | exponent | mantissa | 數值 |
0 | 000 0000 0000 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | 0.0 |
1 | 000 0000 0000 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | -0.0 |
0 | 000 0000 0000 | 不爲0 | 下溢數 |
0 | 111 1111 1111 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | 無窮大 |
0 | 111 1111 1111 | 不爲0 | NaN |
0 | 011 1111 1111 | 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | 1.5 |
注:二進制
二進制 | 數值 |
0000 0000 0000 0000 0000 0000 0000 0000float 0000 0000 0000 0000 0000 0010 0010 1011 |
555 |
0100 0000 1000 0001 0101 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
555.0 |
int64最高非零位之後的二進制位 === float64 mantissa,因此float64能夠不損失精度表示的最大int64範圍是-253 ~ 253,253+1就無法表示了。然而,諸如253+2一類的int64仍然能夠不損失精度地用float64表示。