理解二进制小数定义与转换方法推导

理解二进制小数定义与转换方法推导

说起二进制小数,上学时很多教学都是直接填鸭式地说明计算方法,但我较笨总是理解上有些困惑,不太知其所以然。后来工作中用到时想明白了数学逻辑,顺便记录一下。


常规算法

十进制转二进制

整数部分直接转换,小数部分就是不断地乘以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} 121+120+021+122

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,81n1)=1

结合十进制和二进制相互转化的算法,一下子就十分形象。

例:

有一个十进制的小数0.6875

只用从所有 2 − n 2^{-n} 2n的集合中选择一些项目, { 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} 22只能1个或0个,所以只能接近,不能相等

这里就很好理解转换算法了

转换算法理解

十进制转二进制

十进制转2进制时乘以2,是为了确认当前余数是否够1个 2 − n 2^{-n} 2n

还是例子0.6875,设余数部分为A

  • 第一步,要判断是否要拿1个0.5,所以 0.6875 × 2 = 1.357 ≥ 1 0.6875\times 2=1.357\ge1 0.6875×2=1.3571,那么第一位取1,即取1个0.5

    比较 A × 2 ≥ 1 A \times 2 \ge 1 A×21 就是比较 A ≥ 0.5 A \ge 0.5 A0.5 ?,两边同时除以2

  • 第二步,余数 0.375 × 2 = 0.75 ≤ 1 0.375\times 2=0.75\le 1 0.375×2=0.751,即再加一个0.25就超过目标了,所以第二位取0,即取0个0.25

    余数更新为 B B B B = ( A − 0.5 ) × 2 B=(A-0.5)\times 2 B=(A0.5)×2,需要判断小数减去1个0.5后的剩余部分是否超过1个0.25的大小,

    ( A − 0.5 ) ≥ 0.25 (A-0.5) \ge 0.25 (A0.5)0.25?,两边同时乘以4,然后代入当前余数B, ( ( A − 0.5 ) × 2 ) × 2 ≥ 1 ) ((A-0.5) \times 2) \times 2 \ge 1) ((A0.5)×2)×21),即 B × 2 ≥ 1 B \times 2 \ge 1 B×21

  • 第三步,余数 0.75 × 2 = 1.5 ≥ 1 0.75 \times 2 = 1.5 \ge 1 0.75×2=1.51,即再加一个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.b0b1b2bn1 转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} b021+b122+b223+bn12n

  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值