浮点数的二进制表示

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

 

 

 

 

 

 

注:二进制

  • float类型能够表示正零值和负零值
  • mantissa从左到右第N位表示2-N,例如1.5的二进制表示。

int64与相等float64的二进制关联

二进制 数值

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表示。

相关文章
相关标签/搜索