给定重复的二进制数,例如0.(0011)或0.0(101),如何将其转换为十进制?
到目前为止我能够挖掘的是将终止二进制数转换为十进制的简单方法,如下所示:
res(N+2) = res(N+1) / 2 + res(N)
其中res是步骤N之后的结果,N是当前迭代(N = 0; n->(num二进制数字))。将其重复应用于非终止二进制数可以得到很好的近似值,例如
dec:0.4 || bin: 0.(0110):
0 / 2 + 0 = 0
0 / 2 + 0 = 0
0 / 2 + 1 = 1
1/2 / 2 + 1 = 3/2
3/2 / 2 + 0 = 3/4
3/4 / 2 + 0 = 3/8
3/8 / 2 + 1 = 19/16
19/16 / 2 + 1 = 51/32
51/32 / 2 + 0 = 51/64
51/64 / 2 + 0 = 51/128 = 0.3984
大约是0.4。
所以,我有一种计算近似值的方法,但我正在努力寻找表达这种方法的方法。我已经开始尝试将它写成一个我可以在极限上计算的系列作为n-> inf,到目前为止没有太大的成功。
答案 0 :(得分:3)
给定重复的二进制数,例如0.(0011)或0.0(101),如何将其转换为十进制?
这可以用十进制中的相同方式以二进制求解(即,可以确定精确的有理数量)。在十进制中,如果我们有0.(567)
,并且我们想确定它所代表的确切有理数量,我们只需将567
作为分子,999
(具有n
的数字9
n
s,其中0.(567) = 567/999 = 189/333 = 63/111
是重复组中的位数)作为我们的分母:
n
现在是最低的。这个过程是完整无限几何级数结果mentioned by @Rick Regan的升华。
在二进制文件中我们做同样的事情,除了9
n
s作为我们的分母,我们想要1
1
s(0.(0011) = 0011 / 1111 =(in decimal) 3/15 = 1/5
是二进制中的最高位数)。例如,
0.0(101)
如果在重复组之前有数字,只需对此计算进行一些算术运算:例如,0.(101)
只是101 / 111
除以2.后者是5/7
或{ {1}},0.0(101)
为5/14
。
答案 1 :(得分:1)
即便是计算机也没有这么做。通常,该值只是四舍五入。如果你开始以太高的精度显示浮点值,你最终会得到奇怪的值,如0.3984而不是0.4。
将任何基数的任何小数转换为另一个基数通常会导致精度损失。你无法神奇地恢复。这是你永远不应该在一个重要的东西如金钱的程序中使用花车或双打的主要原因。
继续前进,直到你认为你已经足够精确,然后完成它。
答案 2 :(得分:1)
获得确切答案的一种方法是使用无限几何系列。分数r的无限和幂,对于指数1到无穷大,0 <= r <1。 1,是r /(1-r)。
在您的示例中,0。(0011),0.0011表示3/16分数。将3除外,你得到r = 1/16。 r /(1-r)=(1/16)/(15/16)= 1/15。乘以你所考虑的3,你会得到你的答案:3/15 = 1/5 = 0.2。
答案 3 :(得分:0)
如果使用最大位数(以10为基数的9,以2为基数的位数)进行与十进制相同的操作,则可以将所有步骤汇总在一起,其次数等于重复的数字,而0等于整数。重复数字之前的位数。希望该示例可以清楚地说明这一点:
0.196(2) = (196*9 + 2)/(9000)
0.12(034) = (12*999 + 34)/99900
b0.01(011) = (b1*b111 + b11)/b11100 = (1*7 + 3)/(7*4) = 10/28