Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 将重复的二进制数转换为十进制数(表示为级数?)_Binary_Repeat_Numerical Methods_Base Conversion - Fatal编程技术网

Binary 将重复的二进制数转换为十进制数(表示为级数?)

Binary 将重复的二进制数转换为十进制数(表示为级数?),binary,repeat,numerical-methods,base-conversion,Binary,Repeat,Numerical Methods,Base Conversion,给定一个重复的二进制数,例如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

给定一个重复的二进制数,例如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.(0011) = 0011 / 1111 =(in decimal) 3/15 = 1/5
大约是0.4


所以,我已经有了一种计算近似值的方法,但我正在努力寻找一种表达方法。我已经开始尝试将它写成一个系列,我可以以n->inf的极限计算,但迄今为止没有太多成功。

即使是计算机也不太正确。通常,该值只是四舍五入。如果开始显示精度太高的浮点值,最终会出现奇怪的值,如0.3984,而不是0.4

将任何基数的任何小数点转换为另一个基数通常会导致精度损失。你无法神奇地恢复。这是一个主要的原因,你不应该使用浮动或双倍在一个程序,计算重要的东西,如金钱


<>请一直走,直到你认为你已经足够精确了,然后把它舍弃。< / P> < P>一个精确答案的方法是使用无穷几何级数。分数r的无穷幂和,对于指数1到无穷大,0 给定一个重复的二进制数,例如0.(0011)或0.0(101),如何将其转换为十进制

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

0.(567) = 567/999 = 189/333 = 63/111
现在的价格是最低的。这个过程是对完整的无限几何级数结果的升华

在二进制中,我们做同样的事情,不同的是,我们想要的不是
n
9
s作为分母,而是
n
1
s(因为
1
是二进制中的最高数字)。比如说

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.(0011) = 0011 / 1111 =(in decimal) 3/15 = 1/5

如果重复组前面有数字,只需围绕此计算进行一些算术运算:例如,
0.0(101)
就是
0.(101)
除以2。后者是
101/111
,或
5/7
,因此
0.0(101)
5/14
,如果使用最大的数字(以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

这正是我所采用的方法,尽管我仍然好奇是否有办法计算出准确的值。直觉上,我觉得我应该能够在无穷远的范围内完成这项工作,但我似乎无法动脑去写它(我已经好几年没有接触过这种数学了……)