浮点数在计算机中的存储
一,基础预备知识
1,十进制转换为二进制
1.1 整数部分:
连续,除以2,取余数,余数为0或1,53 / 2 = 26R1 26 / 2 = 13R0 13 / 2 = 6R1 6 / 2 = 3 R0 3 / 2 = 1 R1 1/2 = 0R1 ,对应二进制为110101(从右往左)
1.2 小数部分:
连续乘以2,大于1取1,如0.7转换成二进制为:0.7*2 = .4 + 1 0.4*2 = 0.8 + 0 0.8*2 = 0.6 + 1 0.6*2 = 0.2 +1 0.2*2 = 0.4 + 0(进入循 环),对应二进制为10110....(从左往右) 所以十进制53.7转换二进制为:110101.10110(0110循环)
2,二进制转换成十进制:
2.1 对应位数次方,分数位为负数次方
二,IEEE标准
1,浮点数格式:包含三个部分,符号位(+或者是-),指数位,尾数,格式为+1.bbbb...b*2^p
精度 | sign | exponent | mantissa |
single | 1 | 8 | 23 |
double | 1 | 11 | 52 |
long double | 1 | 15 | 64 |
例如十进制9,二进制为1001,存储方式为+1.001*2^3
2,对double的讨论
2.1 double精度1,二进制为+1.000...00(52个0)*2^0,下一个比1大的数为+1.000...01*2^0,十进制为1+2^(-52)
益普希龙mach为1与比1大的最小浮点数的差值,为2^(-52),9.4---1001.0110----double格式为+1.0010110...1100*2^3
2.1 当尾数超出52位时需要舍去余下部分,分为两种:chopping与rounding,其中chopping简单就是把超出52位的扔掉(不好)
2.2 rounding:类似于十进制的四舍五入,rounding分为两种情况,当52为以后为:(52位)100....(全为0),进位和舍去取决于哪种使得52为0
其余情况为53为1就进位,为0就舍去
2.3 十进制9.4在双精度表示下的误差:9.4---1.110.....1100|110...舍去部分为: .1100*2^(-52)*2^3---十进制为.4*2^(-48),应为53位为1,所以要进一位,增加2^(-52)*2^3---十进制为2^(-49)
所以最后结果为fl(9.4) = 9.4 + 2^(-49) -0.4*2^(-48) = 9.4 + 0.2*2^(-49),误差为0.2*2^(-49)(rounding error)