La respuesta
Por Jacobo Tarrío
7 de setiembre de 2003

En la anterior historia les hacía dos preguntas. Aquí van las respuestas (para que vean lo buena persona que soy :-)).

Primero, la segunda pregunta. ¿Por qué el estándar de representación binaria de números en coma flotante IEEE 754 dice que se utilizan N bits para almacenar una mantisa de N+1 bits?

Antes de nada, para que recuerden: en el número \(1,011 \cdot 10^{110}\), por ejemplo, la mantisa es 1,011, y el exponente es 110. Bien; IEEE 754 dice que se almacenaría en la parte de la mantisa el número 011, porque el 1 es implícito. O sea, un cero no puede ser, porque entonces sería un desperdicio de cifras significativas: se podría aumentar el exponente hasta que deje de ser cero. O sea, el número \(0,0101 \cdot 10^{101}\) es un absurdo, porque se podría representar como \(1,01 \cdot 10^{11}\). Y, descartado el cero, lo único que queda es un 1.

La primera pregunta era: ¿cómo se convierte un número con coma decimal en un número con coma binario? Lo explicaré con un ejemplo.

Supóngase el número \(3,75_{(10}\) (o sea, 3,75 decimal). Para pasarlo a binario, se convierten a binario las partes entera y fraccionaria por separado y luego se suman. 3,75 es 3+0,75. 3 es 11 en binario; convertir 0,75 es la parte peliaguda.

0,75 es igual a 0,75/1 (0,75 dividido entre 1), lo cual es trivial. Multipliquemos el dividendo y el divisor por 2, lo cual nos dará otra representación del mismo número: 1,5/2. Si lo repetimos tendremos 3/4. Ahora como el dividendo es entero, nos detenemos y convertimos el dividendo y el divisor a binario: \(\frac{3}{4}_{(10}\) = \(\frac{11}{100}_{(2}\). Por tanto, \(3,75_{(10}\) = \(3+0,75_{(10}\) = \(3+\frac{3}{4}_{(10}\) = \(11+\frac{11}{100}_{(2}\) = \(11+0,11_{(2}\) = \(11,11_{(2}\).

Ahora una situación algo más peliaguda: un número que no se puede convertir a binario de forma exacta. Por ejemplo, 0,3. 0,3 = \(\frac{0,3}{1}\) = \(\frac{0,6}{2}\) = \(\frac{1,2}{4}\) = \(\frac{2,4}{8}\) = \(\frac{4,8}{16}\) = \(\frac{9,6}{32}\) = … y así podríamos seguir hasta el infinito, ya que no es posible obtener un dividendo entero multiplicándolo por dos. En este caso deberemos limitarnos a detenernos cuando tengamos un número de cifras significativas suficiente, y conformarnos con esto. Por ejemplo, con 9,6/32 hemos llegado a cinco cifras significativas. Para obtener la representación en binario, antes redondeemos 9,6 al entero más cercano, y luego convirtamos a binario: \(\frac{10}{32}_{(10}\) = \(\frac{1010}{100000}_{(2}\) = \(0,01010\).

Esto de que algunos números decimales fraccionarios no tengan representación exacta en binario es un problema, aunque no exclusivo del binario. Nosotros mismos, trabajando en base 10, tenemos este problema todos los días; por ejemplo, al dividir un número entre 3. Este problema no sería tan grave si, como los sumerios, trabajáramos con base 60: el 60 es divisible por 2, por 3, por 4, por 5, por 6, por 10 y por otros números menos importantes. Es, por cierto, el motivo por el que las horas tienen 60 minutos, y no 10 o 100 :-)

Hala, otro día les hablaré de otras cosas. Pásenlo bien.

Otros artículos sobre “Tirando Líneas (2002-2004)”, “coma flotante”.
Índice.
Salvo indicación en contrario, esta página y su contenido son Copyright © Jacobo Tarrío Barreiro. Todos los Derechos Reservados. Información sobre tratamiento de datos y condiciones de uso.