关于浮点数的存储方式探讨

主要是浮点数怎么转换为二进制数?下面来看一张图:

关于浮点数的存储方式探讨

第一位是符号位,这个和整型数的存储方式相似,0表示正数,1表示负数。

第二部分是exponent,这部分八位(64位系统是11位)是指数位,是以2为底数的指数,而且是从2^7-1开始,也就是0111 1111,十进制是127开始的,即0111 1111代表的是2^0。

第三部分是mantissa,这部分是23位(64位系统是52位)基数位,就是具体的小数部分的二进制表示。

下面举个简单的例子

比如有一个浮点数是66.6,那么第一步这是个正数,所以符号位为0,第二步,这个数的整数部分是66,二进制表示为100 0010,小数部分是0.6,可以表示为.1001 1001 1001 1001 1001...,那么这个数可以暂且表示为 

100 0010.1001 1001 1001 1001 1001...,根据上面的浮点数存储方式往里面填数字,第一位是符号位0,指数位是这样的:100 0010 --》1.000010 * 2 ^ 6,因为指数位是从127开始的,所以127+6=133,133二进制是1000 0101,基数位23位写为 00 0010 1001 1001 1001 1001 1,所以这个数应该如下:

1.0000 1010 0110 0110 0110 011 *2^6,那么按照上面的填充的话最后的结果是:

0 1000 0101 0000 1010 0110 0110 0110 011

这个数就是浮点数66.6的二进制储存方式!

接下来还有一些关于浮点数的小知识,第一个就是以上所讲的浮点数是规格化的浮点数,因为不难看出规格化浮点数的精度与指数部分有很大的关系,范围在2^7-1 ~ 2^8-1,也就是说如果不在这个范围内,那么cpu就得舍弃一部分位,这样最好是精度不高,最坏的情况是除数为0的错误,因为数值太小所以舍弃之后作为0处理。可怕!

所以还有一种非规格化的浮点数,区别在于规格化浮点数的整数位总取1,而非规格话允许整数位为0,这样小数的范围就多了2^22,但是这样付出的代价是cpu需要硬件支持并且运算速度比规格化浮点数慢100倍!