小数二进制和十进制转换

十进制转换二进制

规则:将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将之前所得的数小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,直到小数部分为0。显然就会发现小数部分一直不等于0的情况,这时候就得到一个无限位数的二进制小数点,计算机就无法完整保存所以就出现了所谓的浮点误差。
比如2.30换成二进制
0.3 * 2 = 0.6 ——————- 0
0.6 * 2 = 1.2 ——————- 1
0.2 * 2 = 0.4 ——————- 0
0.4 * 2 = 0.8 ——————- 0
0.8 * 2 = 1.6 ——————- 1
0.6 * 2 = 1.2 ——————- 1
所以二进制为:10.01001100110011……
比如2.75换成二进制
0.75 * 2 = 1.5——————- 1
0.5 * 2 = 1.0 ——————- 1
所以二进制为:10.11

二进制转换十进制

这部分和整数部分差不多。乘以相应位数的负值方比如
上面的

10.11001100110011=121+020+121+122+023+=2.30 10.11001100110011……=1*2^{1}+0*2^{0}+1*2^{-1}+1*2^{-2}+0*2^{-3}+…………=2.30
10.11=121+020+121+122=2.75 10.11=1*2^{1}+0*2^{0}+1*2^{-1}+1*2^{-2}=2.75

传说中的浮点误差

由上面两个例子可以知道
2.30二进制为:10.01001100110011……

如果计算机只能保存四位那么就保存了前四位10.01,再次读取出来时转为十进制就是2.25,误差贼大

但是

2.75的二进制为:10.11
如果计算机只能保存四位那么就保存了前四位10.11,再次读取出来时转为十进制就是2.75,没有误差

如果能保存八位呢2.30保存为10.010011,再次读取出来时转为十进制就是2.296875,,再和原来一样保留两位小数点就是2.29,越来越接近2.30了,学过无穷级数会知道,这是无穷级数相加会越来越接近。但是取出来后只保留两位小数点,所以到2.9之后多接近都是2.9除非去掉的部分四舍五入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章