3

给定一个重复的二进制数,例如 0.(0011) 或 0.0(101),如何将其转换为十进制?

到目前为止,我能够挖掘出的是将终止二进制数转换为十进制的简单方法,如下所示:

res(N+2) = res(N+1) / 2 + res(N)

其中 res 是步骤 N 之后的结果,N 是当前迭代 (N=0; n->(num binary digits))。例如,将其重复应用于非终止二进制数会得到一个很好的近似值

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 到目前为止没有太大的成功。

4

4 回答 4

4

给定一个重复的二进制数,例如 0.(0011) 或 0.0(101),如何将其转换为十进制?

这可以用二进制解决(即可以确定确切的有理数),就像用十进制一样。在十进制中,如果我们有 ,0.(567)并且我们想确定它所代表的确切有理数,我们只需将567其作为我们的分子,并且999(具有n 9s 的数字,其中n是重复组中的位数)作为我们的分母:

0.(567) = 567/999 = 189/333 = 63/111

现在是最低的。这个过程是@Rick Regan 提到的完整无限几何级数结果的提炼。

在二进制中我们做同样的事情,除了我们想要s而不是n 9s作为我们的分母n 1(因为1它是二进制中的最高位)。所以例如

0.(0011) = 0011 / 1111 =(in decimal) 3/15 = 1/5

如果在重复组之前有数字,只需围绕此计算进行一些算术运算:例如,0.0(101)0.(101)除以 2。后者是101 / 111,或5/7,所以0.0(101)5/14

于 2010-01-24T14:44:34.293 回答
1

获得准确答案的一种方法是使用无限几何级数。对于指数 1 到无穷大,0 <= r < 1,分数 r 的无限次方和是 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。

于 2010-01-24T14:23:48.873 回答
0

甚至计算机也不能完全正确。通常,该值只是四舍五入。如果您开始以过高的精度显示浮点值,您最终会得到奇怪的值,例如 0.3984 而不是 0.4。

将任何基数的任何小数转换为另一个基数通常会导致精度损失。你无法神奇地恢复它。这是您永远不应该在计算金钱等重要事物的程序中使用浮点数或双精度数的主要原因。

继续前进,直到您认为自己已经足够精确,然后将其四舍五入。

于 2010-01-24T05:13:25.537 回答
0

如果您使用最大的数字(以 10 为底的 9,以 2 为底的 1)执行与十进制相同的操作,则可以一步将所有内容放在一起,次数等于重复的数字,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
于 2019-01-17T01:38:24.143 回答