单精度浮点数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表示。