众所周知,浮点数的有效位数是6-7位,为什么有该结论,需要从它的存储结构说起。IEEE 754标准进行存储定义了其格式:
第一段 占 1bit,表示符号位。代称为 S(sign)
第二段 占 8bits,表示指数。代称为 E(Exponent)。
第三段 占 23bits,表示尾数。代称为 M(Mantissa)。
S: 符号位 0代表正数 1代表负数
E: 指数位 对于任何数来说 都可以满足
M: 尾数位 也就是小数位,但是这里叫偏移量可能好一些 根据上面二进制转换来说的话
举例:3.14
(3.14 - 2) / (4 - 2) = 0.57, 而 0.57∗2^23=4781506.56 四舍五入 也就4781507 (上面其实也四舍五入了) 在转为二进制
最后 3.14 的二进制表示
我们再用 IEEE 754 的那个算式来算一下:
这个时候 就发现精度丢失了。
另:
1、为什么减去127
计算机表示单精度浮点数时,是用8位去存储指数部分(见上图E8bit),在数值上面,表示0~255(全表示正数,无法表示负数,),但是指数同样有负数的情况,如果用8位去表示正负数的话,最小是8位负数(含符号位)即1 1111111(最左边是1,表示负数),1 1111111(转换为十进制为-127),即0的左边是127个数,表示负数,因为总共有255个数(0~255),故0的右边只能有255-127=128,转换为二进制是1 000 0000;又因为浮点数的指数在存储时只能存储不能带符号的数(无符号数),所以把-127~128区间的数转化为一个正数那就好了,于是就出现了在计算机存储之前将浮点数指数的基础上加上127,即可满足指数都会变成正数的情况
2、当E全为0时:
这时指数E等于1-127为真实值,M不再加上舍去的1,而是还原为0.xxxxxxxx小数。