johnny pauling
Tengo este ejemplo sobre cómo convertir de un número base 10 a una representación flotante IEEE 754
Number: 45.25 (base 10) = 101101.01 (base 2) Sign: 0
Normalized form N = 1.0110101 * 2^5
Exponent esp = 5 E = 5 + 127 = 132 (base 10) = 10000100 (base 2)
IEEE 754: 0 10000100 01101010000000000000000
Esto tiene sentido para mí excepto un pasaje:
45.25 (base 10) = 101101.01 (base 2)
45 es 101101 en binario y está bien… pero ¿cómo obtuvieron el 0.25 como .01?
carl norum
Valor posicional sencillo. En base 10, tienes estos lugares:
… 103 102 101 100 . 10-1 10-2 10-3 …
… miles, centenas, decenas, unidades. décimas, centésimas, milésimas…
Del mismo modo, en binario (base 2) tienes:
… 23 22 21 20 . 2-1 2-2 2-3 …
… ochos, cuatros, doses, unos. mitades, cuartos, octavos…
Así que el segundo lugar después del .
en binario son unidades de 2-2bien conocido por usted como unidades de 1/4 (o alternativamente, 0,25).
-
+1, aunque me pareció un poco gracioso referirme a los lugares binarios como “ochos, cuatros…” cuando nunca hay más de uno de esos valores por lugar.
–David Kaczynski
08/03/2013 a las 16:00
-
@David, ese es un buen punto. Estaba dudando sobre qué hacer allí, pero opté por los plurales para que coincidieran con el uso común de decimales, con la esperanza de que la explicación sea fácil de entender.
–Carl Norum
8 de marzo de 2013 a las 16:54
mkataja
Puedes convertir la parte después del punto decimal a otra base multiplicando repetidamente por la nueva base (en este caso, la nueva base es 2), así:
0.25 * 2 = 0.5
-> El primer dígito binario es 0 (se toma la parte entera, es decir, la parte anterior al punto decimal).
Continúe multiplicando con la parte después del punto decimal:
0.5 * 2 = 1.0
-> El segundo dígito binario es 1 (nuevamente, tome la parte entera).
Aquí también es donde nos detenemos porque la parte después del punto decimal ahora es cero, por lo que no hay nada más que multiplicar.
Por lo tanto la representación binaria final de la parte fraccionaria es: 0.012.
Editar:
También vale la pena señalar que es bastante frecuente que la representación binaria sea infinita incluso cuando se comienza con una parte fraccionaria finita en base 10. Ejemplo: convertir 0.210 a binario:
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = ...
Entonces terminamos con: 0.001100110011…2.
Usando este método, verá con bastante facilidad si la representación binaria termina siendo infinita.
Pato mugido
Los “decimales” (bits fraccionarios) en otras bases son sorprendentemente poco intuitivos considerando que funcionan exactamente de la misma manera que los números enteros.
base 10
scinot 10e2 10e1 10e0 10e-1 10e-2 10e-3
weight 100.0 10.0 1.0 0.1 0.01 0.001
value 0 4 5 .2 5 0
base 2
scinot 2e6 2e5 2e4 2e3 2e2 2e1 2e0 2e-1 2e-2 2e-3
weight 64 32 16 8 4 2 1 .5 .25 .125
value 0 1 0 1 1 0 1 .0 1 0
Si empezamos con 45,25, es mayor/igual que 32, por lo que sumamos un 1 binario y restamos 32.
Nos quedamos con 13,25, que es menor que 16, por lo que agregamos un 0 binario.
Nos quedamos con 13,25, que es mayor/igual que 8, por lo que sumamos un 1 binario y restamos 8.
Nos quedamos con 05.25, que es mayor/igual que 4, por lo que sumamos un 1 binario y restamos 4.
Nos quedamos con 01.25, que es menor que 2, por lo que agregamos un 0 binario.
Nos quedamos con 01.25, que es mayor/igual que 1, por lo que sumamos un 1 binario y restamos 1.
Con números enteros, nos quedaría cero, así que nos detenemos. Pero:
Nos quedamos con 00.25, que es más pequeño que 0.5, así que agregamos un 0 binario.
Nos quedamos con 00,25, que es mayor/igual a 0,25, por lo que sumamos un 1 binario y restamos 0,25.
Ahora tenemos cero, así que paramos (o no, puedes seguir y calcular ceros para siempre si quieres)
Tenga en cuenta que no todos los números “fáciles” en decimal siempre alcanzan ese punto de parada cero. 0.1 (decimal) convertido en base 2, se repite infinitamente: 0.0001100110011001100110011… Sin embargo, todos los números “fáciles” en binario siempre se convertirán bien en base 10.
También puedes hacer este mismo proceso con bases fraccionarias (2.5), irracionales (pi) o incluso imaginarias (2i), excepto que la base no puede estar entre -1 y 1 inclusive.
-
Pero no podemos hacer una comparación de números imaginarios, ¿verdad?
– Rotor
8 de marzo de 2013 a las 7:13
-
@Rotsor: Creo que podemos, pero no sé cómo. Knuth descubrió cómo trabajar con bases irracionales: en.wikipedia.org/wiki/Quater-imaginary_base
– Pato mugido
8 de marzo de 2013 a las 17:21
-
@Rotsor & Mooing Duck: Rotsor tiene razón en el sentido de que las desigualdades matemáticas (, =) no están definidas para números complejos. Una forma de solucionar el problema sería usar la base cuaternario-imaginaria de Knuth, ya que los números complejos se pueden escribir en un solo término en esa base (ejemplo 7 + 4i (base 10) = 10323 (base 2i)). Sin embargo, las comparaciones en base decimal no siempre darían los mismos resultados que en quater-imaginary. Por ejemplo: 0 > -4 (base 10), mientras que 0
– nijoakim
5 de abril de 2014 a las 16:59
-
@nijoakim: es bueno saber que las desigualdades matemáticas no están definidas y que la forma “obvia” no coincide con las comparaciones de números racionales. Sin embargo, mantengo mi creencia de que probablemente exista una forma que tenga sentido.
– Pato mugido
5 abr 2014 a las 17:15
-
@MooingDuck: Sí, estoy de acuerdo en que eso es bastante posible. De hecho, he estado tratando de resolver uno desde que publicaste esto, pero resultó ser bastante difícil.
– nijoakim
5 abr 2014 a las 18:45
2.00010 = 2+1 = 10.0002
1.00010 = 2+0 = 01.0002
0.50010 = 2-1 = 00.1002
0.25010 = 2-2 = 00.0102
0.12510 = 2-3 = 00.0012
Las fracciones base 2 son .1 = 1/2, .01 = 1/4. …
mandril petras
Piénsalo de esta manera
(punto) 2^-1 2^-2 2^-3 etc.
asi que
. 0/2 + 1/4 + 0/8 + 0/16 etc.
Thanasis Ioannidis
Puedes pensar en 0.25 como 1/4.
Dividir por 2 en (base 2) mueve el punto decimal un paso a la izquierda, de la misma manera que dividir por 10 en (base 10) mueve el punto decimal un paso a la izquierda. Generalmente, dividir por M en (base M) mueve el punto decimal un paso hacia la izquierda.
asi que
base 10 base 2
--------------------------------------
1 => 1
1/2 = 0.5 => 0.1
0.5/2 = 1/4 = 0.25 => 0.01
0.25/2 = 1/8 = 0.125 => 0.001
.
.
.
etc.