思考题1:什么样的10进制小数可以无误差求解对应的二进制小数?
推导如下:
假设一个有限位数二进制小数为(0.a1a2a3a4…an)2 ,同时假设其转换后的10进制小数为(M)10。将二进制小数(0.a1a2a3a4…an)2 ,按权值展开可得:
(0.a1a2a3a4…an)2 = a1 x 2-1 + a2 x 2-2 + a3 x 2-3 + a4 x 2-4 + a5 x 2-5 …… + an x 2-n = (M)10
因为二进制数码取值范围为0 和1,所以a1 、a2 、 a3、 a4 、a5、…… an取值为0 或1。a1 、a2 …… an不同的取值组合可分为3种,第一种a1 、a2 …… an全部取值0,第二种全部取值1,第三种部分取值0,部分取值1:
组合1:a1 、a2 、 a3、 a4 、a5、…… an 都为0,二进制小数按权展开后如下:
(0.a1a2a3a4…an)2 = 0 x 2-1 +0 x 2-2 + 0 x 2-3 + 0x 2-4 + 0 x 2-5 …… + 0 x 2-n = (M)10 最后结果是0,小数无效。
组合2:a1 、a2 、 a3、 a4 、a5、…… an 都为1,二进制小数按权展开后如下:
(0.a1a2a3a4…an)2 = 2-1 + 2-2 + 2-3 + 2-4 + 2-5 …… + 2-n = (M)10
从以上等式可看出(0.a1a2a3a4…an)2 转换后的10进制小数(M)10 是多个2的负幂次方数之和。
组合3:a1 、a2 、 a3、 a4 、a5、…… an 部分为0,部分为1,由于0与任何值相乘都为0,对结果无影响,所以剩下的2的负幂次方数相加最后的结果依然是多个2的负幂次方数之和。
结论:一个有限位二进制小数转换后的10进制小数一定是一个2的负幂次方数。所以只有当这个10进制小数是多个2的负幂次方数之和时,才能无误差求解二进制小数,下面我们举例说明推论的正确性。
举例1:10进制小数 (0.5)10 = ( 2-1)10 ,利用基数连乘法,竖式求解如下:
得二进制小数(0.5)10 = (2-1)10 = (0.1)2
举例2:10进制小数 (0.75)10 = (2-1 +2-2)10,利用基数连乘法,竖式求解如下:
得二进制小数(0.75)10 = (2-1 +2-2)10 = (0.11)2
举例3:10进制小数 (0.875)10 = (2-1 +2-2 + 2-3 )10,利用基数连乘法,竖式求解如下:
得二进制小数(0.875)10 = (2-1 +2-2 + 2-3 )10 = (0.111)2
举例4:10进制小数 (0.625)10 = (2-1 + 2-3 )10,利用基数连乘法,竖式求解如下:
得二进制小数(0.625)10 = (2-1 + 2-3 )10 = (0.101)2
以上4个例子的10进制小数都是多个2的负幂次方数之和,可以无误差的求解对应的二进制小数,说明我们的推导是正确的。
思考题2:如何证明二进制小数精度取值的正确性?
推导如下:
假设一个10进制小数用基数连乘法转换后的2进制小数为N,求解到的二进制小数的位数总共为m位。用权展开式可得:
N = 2-1 + 2-2 + 2-3 + 2-4 + 2-5… + 2-m
要求计算后的2进制小数精度为A,假设取值到n位时得到2-n ≤ A ,如果此时的取值已经满足精度要求,则n位后丢弃的全部小数之和肯定比A小,假设丢弃位的数值之和为B,用权展开式可得:
B = 2-(n+ 1) + 2-(n+ 2)+ 2-(n+ 3)…… + 2-(m-n)
为证明我们的取值满足精度要求,我们需要证明 B < A。
根据等比数列特点,我们可对B化简,:
B = (2-(n+ 1)– 2-(m-n)* 2-1)/(1-2-1)
= (2-(n+ 1)– 2-(m-n+1))/(1-2-1)
= (2-(n+ 1)– 2-(m-n+1))/2-1
= 2-n– 2-(m-n)
假设m 无穷大,那么2-(m-n) 就无穷接近0,但永远不可能 等于0,一个被减数减去一个比0大的数,其最后的结果肯定比原值更小,所以可得出:
2-n– 2-(m-n) < 2-n,我们已知 2-n < A, 所以 2-n– 2-(m-n) 肯定比 小A,即B< A,由此得出我们的假设成立,小数位数取值到n位满足精度要求,我们也可以用实际的例子证明。
举例1:假设一个10进制小数用基数连乘法转换为对应2进制小数后,求解到的二进制小数的位数总共为m1位,要求计算后的2进制小数精度为0.5。根据我们的推导公式可得2-n ≤ 0.5 算出n = 1,B = 2-n– 2-(m1-n) = 2-1 – 2-(m1-1) < 0.5 。
举例2:假设一个10进制小数用基数连乘法转换为对应2进制小数后,求解到的二进制小数的位数总共为m2位,要求计算后的2进制小数精度为0.26。根据我们的推导公式可得2-n ≤ 0.26 算出n = 2,B = 2-n– 2-(m2-n) = 2-2 – 2-(m2-2) < 0.25 < 0.26 。
举例3:假设一个10进制小数用基数连乘法转换为对应2进制小数后,求解到的二进制小数的位数总共为m3位,要求计算后的2进制小数精度为0.126。根据我们的推导公式可得2-n ≤ 0.126 算出n = 3,B = 2-n– 2-(m2-n) = 2-3 – 2-(m2-3) < 0.125 < 0.126 。
总结:通过以上3个例子也能很好证明我们推导是正确的,从而证明我们对二进制小数的位数取值也是正确的。