Convertir un número binario repetido a decimal (¿expresarlo como una serie?)
-
22-09-2019 - |
Pregunta
Dado un número binario que se repite, por ejemplo 0.(0011) o 0.0(101), ¿cómo se convertiría a decimal?
Lo que he podido desenterrar hasta ahora es el método simple para convertir un número binario terminal a decimal, como se muestra a continuación:
res(N+2) = res(N+1) / 2 + res(N)
donde res es el resultado después del paso N y N es la iteración actual (N=0;n->(núm. dígitos binarios)).Aplicar eso repetidamente a un número binario no terminado da una buena aproximación, por ejemplo
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
que es aproximadamente 0,4.
Entonces, tengo una forma de calcular aproximaciones, pero me cuesta encontrar una manera de expresar esto.Comencé a intentar escribirlo como una serie que puedo calcular en el límite como n->inf sin mucho éxito hasta ahora.
Solución
Una forma de obtener una respuesta exacta es utilizando series geométricas infinitas.La suma infinita de potencias de una fracción r, para exponentes del 1 al infinito, 0 <= r < 1, es r/(1-r).
En su ejemplo, 0.(0011), 0.0011 representa la fracción 3/16.Factoriza el 3 y obtienes r=1/16.r/(1-r) = (1/16)/(15/16) = 1/15.Multiplica eso por los 3 que factorizaste y obtendrás tu respuesta:3/15 = 1/5 = 0,2.
Otros consejos
Dado un número binario que se repite, por ejemplo 0. (0011) o 0,0 (101), cómo uno va sobre la conversión a decimal?
Esto puede resolverse (es decir, la cantidad racional exacta puede ser determinada) en binario de la misma manera como en decimal. En decimal, si tenemos, por ejemplo, 0.(567)
, y queremos determinar la cantidad racional exacta que representa, simplemente tomar 567
como nuestro numerador y 999
(el número que tiene n
s 9
, donde n
es el número de dígitos de la grupo) repetir como nuestro denominador:
0.(567) = 567/999 = 189/333 = 63/111
que ahora está en su mínima expresión. Este proceso es una destilación del infinito resultado completo serie geométrica mencionado por @Rick Regan .
En binaria que hacemos lo mismo, excepto que en lugar de n
s 9
como nuestro denominador, queremos n
s 1
(como 1
es el dígito más alto en binario). Así, por ejemplo
0.(0011) = 0011 / 1111 =(in decimal) 3/15 = 1/5
Cuando usted tiene dígitos antes de que el grupo de repetición, acaba de hacer un poco de aritmética en torno a este cálculo:. Por ejemplo, 0.0(101)
es sólo 0.(101)
dividido por 2. Este último es 101 / 111
o 5/7
, por lo que es 0.0(101)
5/14
Incluso los equipos no lo consigue del todo bien. Por lo general, el valor es simplemente redondeado. Si comienza a mostrar valores de coma flotante con demasiada precisión, que va a terminar con los valores extraños como 0,3984 en lugar de 0,4.
Convertir cualquier decimal de cualquier base a otra base menudo induce una pérdida de precisión. No se puede recuperar que mágicamente. Es la razón principal por la que nunca se debe utilizar flotadores o dobles en un programa que cuenta cosas importantes como el dinero.
Sigue adelante hasta que se considera que has ben lo suficientemente precisa, y alrededor de ella fuera.
Puede poner todo junto en un solo paso si lo hace lo mismo que en decimal utilizando el mayor dígito (9 en la base 10, 1 en base 2) el número de veces igual a los dígitos repetidos y 0s igual a la número de dígitos antes de los dígitos repetidos. Con suerte el ejemplo aclara esto:
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