理解二进制小数定义与转换方法推导
说起二进制小数,上学时很多教学都是直接填鸭式地说明计算方法,但我较笨总是理解上有些困惑,不太知其所以然。后来工作中用到时想明白了数学逻辑,顺便记录一下。
常规算法
十进制转二进制
整数部分直接转换,小数部分就是不断地乘以2,取整数部分作为当前位,小数部分继续乘以2,循环x位或到小数部分为0。
例子:
十进制:3.25
二进制:11.01
整数:3=11
小数:01
第一位:0.25*2=0.5, 取0
第二位:0.5*2=1,取1,终止
二进制转十进制
小数位由高到低,依次乘以2^-n, n=1,2,3…,类同整数位
例子:
二进制:11.01
1 ⋅ 2 1 + 1 ⋅ 2 0 + 0 ⋅ 2 − 1 + 1 ⋅ 2 − 2 1\cdot 2^1 + 1\cdot 2^0 + 0\cdot 2^{-1} + 1\cdot2^{-2} 1⋅21+1⋅20+0⋅2−1+1⋅2−2
1 ⋅ ( 2 ) + 2 + 1 ⋅ ( 1 ) + 0 ⋅ ( 0.5 ) + 1 ⋅ ( 0.25 ) 1\cdot(2)+2+1\cdot(1)+0\cdot (0.5) + 1\cdot (0.25) 1⋅(2)+2+1⋅(1)+0⋅(0.5)+1⋅(0.25)
3.25 3.25 3.25
定义理解
同时看这两部分,不知怎么我很容易联想到泰勒展开,然后就理解了。
具体说,
-
小数,就是一个不足1的数字
-
而数字1,可以无限的除以2细分,把每一部分求和后无限接近于1,即 ∑ 0 ∞ ( 1 2 , 1 4 , 1 8 ⋯ 1 n ) = 1 \sum_{0}^{\infty } (\frac{1}{2},\frac{1}{4},\frac{1}{8}\cdots \frac{1}{n}) = 1 ∑0∞(21,41,81⋯n1)=1
结合十进制和二进制相互转化的算法,一下子就十分形象。
例:
有一个十进制的小数0.6875
只用从所有 2 − n 2^{-n} 2−n的集合中选择一些项目, { 1 2 1 , 1 2 2 , ⋯ , 1 2 n } \left \{\frac{1}{2^1},\frac{1}{2^2},\cdots,\frac{1}{2^n}\right \} {211,221,⋯,2n1},加起来组合这个小数
那么即 1个0.5,0个0.25,1个0.125,1个0.0625, 0.6875 = 0.5 + 0 + 0.125 + 0.0625 0.6875=0.5+0+0.125+0.0625 0.6875=0.5+0+0.125+0.0625
同时,这也解释了为什么某些数会有循环不收敛,因为选项有限,每个 2 − 2 2^{-2} 2−2只能1个或0个,所以只能接近,不能相等
这里就很好理解转换算法了
转换算法理解
十进制转二进制
十进制转2进制时乘以2,是为了确认当前余数是否够1个 2 − n 2^{-n} 2−n
还是例子0.6875,设余数部分为A
-
第一步,要判断是否要拿1个0.5,所以 0.6875 × 2 = 1.357 ≥ 1 0.6875\times 2=1.357\ge1 0.6875×2=1.357≥1,那么第一位取1,即取1个0.5
比较 A × 2 ≥ 1 A \times 2 \ge 1 A×2≥1 就是比较 A ≥ 0.5 A \ge 0.5 A≥0.5 ?,两边同时除以2
-
第二步,余数 0.375 × 2 = 0.75 ≤ 1 0.375\times 2=0.75\le 1 0.375×2=0.75≤1,即再加一个0.25就超过目标了,所以第二位取0,即取0个0.25
余数更新为 B B B, B = ( A − 0.5 ) × 2 B=(A-0.5)\times 2 B=(A−0.5)×2,需要判断小数减去1个0.5后的剩余部分是否超过1个0.25的大小,
即 ( A − 0.5 ) ≥ 0.25 (A-0.5) \ge 0.25 (A−0.5)≥0.25?,两边同时乘以4,然后代入当前余数B, ( ( A − 0.5 ) × 2 ) × 2 ≥ 1 ) ((A-0.5) \times 2) \times 2 \ge 1) ((A−0.5)×2)×2≥1),即 B × 2 ≥ 1 B \times 2 \ge 1 B×2≥1
-
第三步,余数 0.75 × 2 = 1.5 ≥ 1 0.75 \times 2 = 1.5 \ge 1 0.75×2=1.5≥1,即再加一个0.125不会超过目标,所以第三位取1,即取1个0.125
-
第四步,余数 0.5 × 2 = 1 0.5\times 2= 1 0.5×2=1 ,即在加一个0.0625就刚好满足目标,所以第四位取1,即取1个0.0625,然后循环终止
二进制转十进制
二进制转十进制就是简单的组合
二进制小数 0. b 0 b 1 b 2 ⋯ b n − 1 0.b_0b_1b_2\cdots b_{n-1} 0.b0b1b2⋯bn−1 转10进制
b 0 ⋅ 2 − 1 + b 1 ⋅ 2 − 2 + b 2 ⋅ 2 − 3 ⋯ + b n − 1 ⋅ 2 − n b_0\cdot 2^{-1}+b_1\cdot 2^{-2}+b_2\cdot 2^{-3} \cdots + b_{n-1} \cdot 2^{-n} b0⋅2−1+b1⋅2−2+b2⋅2−3⋯+bn−1⋅2−n