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.

¿Fue útil?

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 ns 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 ns 9 como nuestro denominador, queremos ns 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top