單精度浮點數float32和雙精度浮點數float64的二進制表示方法相似,以float64為例,二進制位如圖
sign bit(符號): 用來表示正負號,0代表數值為正,1代表數值為負。
exponent(指數): 用來表示次方數
mantissa(尾數): 用來表示精確度
一個雙精度浮點數所代表的數值為:(-1)sign × 2exponent - 0x3ff × 1.mantissa
0 ≤ exponent ≤ 0x7ff,- 0x3ff 稱為偏正值,使指數即可正亦可負。
為什么不用符號位1bit + 數值位10bit表示形式呢?
答:為了簡化比較。因為,指數的值可能為正也可能為負,如果采用補碼表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常采用一個無符號的正數值存儲
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 |
注:
- float類型可以表示正零值和負零值
- mantissa從左到右第N位表示2-N,例如1.5的二進制表示。
int64與相等float64的二進制關聯
二進制 | 數值 |
0000 0000 0000 0000 0000 0000 0000 0000 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表示。