Coma flotante
Por Jacobo Tarrío
3 de setiembre de 2003

¿Cómo se representan los números “con decimales” en un ordenador? Ah, pues buena pregunta: utilizando una representación binaria de punto flotante. Esto se lo explicaré, pero antes les tengo que decir cómo se representan números fraccionarios en binario.

Antes de nada, llamaré “números con coma” a esos que tienen una parte entera y otra fraccionaria, separadas con una coma, como 0,5 ó 3,1416. Todos sabemos cómo “funcionan” los números decimales con coma; sin embargo, no está tan claro cómo funcionan los números binarios con coma. Para llegar a explicar estos niveles de sofisticación, antes hay que repasar el funcionamiento de los decimales.

Es realmente simple. Estos números decimales con coma se pueden descomponer en sumas: 3,5 es \(3+\frac{5}{10}\); 8,29 es \(8+\frac{29}{100}\) y 394,8493 es \(394+\frac{8493}{10000}\). O sea, es la parte entera, más la parte fraccional dividida por un número que es un uno seguido de tantos ceros como cifras tiene el número fraccionario. De perogrullo, ¿no?

Bueno, pues ahora vamos a ver números binarios con coma: por ejemplo, 11,101 ó 1011,01101. Bien; ¿cuánto es 11,101? Pues fácil: \(11+\frac{101}{1000}\). 1011,01101 vale \(1011+\frac{01101}{100000}\). Suena obvio, pero…

Pero… ¿cuánto valen en decimal? Bueno, pues \(11_{(2}\) vale \(3_{(10}\) (o sea, 11 binario es 3 decimal), \(101_{(2}\) es \(5_{(10}\) y \(1000_{(2}\) es \(8_{(10}\). Por tanto, \(11,101_{(2}\) es \(3+\frac{5}{8}=3,625_{(10}\). Por su parte, \(1011,01101_{(2}\) es igual a \(11+\frac{13}{32}=11,40625_{(10}\).

El mecanismo para convertir un número con coma decimal a un número con coma binario queda como ejercicio para el lector :-)

Hay algo a lo que se ha dado en llamar notación científica, que consiste en utilizar potencias de 10 (cuando se trabaja en base 10, claro) para simplificar la escritura de un número. Por ejemplo, en lugar de escribir 2500000000, se puede escribir \(25 \cdot 10^8\); o, mejor todavía, \(2,5 \cdot 10^9\). En lugar de escribir 0,00000394 se puede escribir \(3,94 \cdot 10^{-6}\). Si, los que utilizan notación científica suelen dejar un solo dígito antes de la coma; de este modo, todo es mas homogeneo.

También se puede utilizar la notación científica en binario, por supuesto; la diferencia es que se utilizan potencias de 2. Por ejemplo, en lugar de 10110000 se puede escribir \(1,011 \cdot 10^{111}\) (si, multiplico por 10, porque ese 10 está en base 2, por lo que es un 2 ;-)). Y en lugar de 0,0001001 se puede escribir \(1,001 \cdot 10^{-100}\).

Y ahora llegamos a lo que quería explicar al principio. Los ordenadores suelen almacenar internamente los números fraccionarios en binario, con notación científica. Tienen un número de cifras binarias determinadas para la mantisa (el número que se multiplica por la potencia de 2) y otro número de cifras para el exponente (de la potencia de 2); con esto consiguen representar un rango de valores muy grande, con un determinado número de cifras significativas.

A esto se le ha dado en llamar “coma flotante”; hay una “coma fija”, en la que el número de cifras de la parte entera y el de la parte fraccionaria están prefijados; sin embargo, en la coma flotante lo único que está fijado es el número de cifras significativas; la coma se puede poner en cualquier posición.

Bueno, y para terminar, el detalle curioso. En el estándar de representación de números en coma flotante IEEE 754, que es el más utilizado en los ordenadores actuales, no se almacenan todas las cifras significativas. Es decir; por ejemplo, en el número \(1,01001 \cdot 10^{1010}_{(2}\) sólo se almacenarían 5 cifras de la mantisa (y las 4 del exponente). ¿Por qué? (Esto también queda como ejercicio para el lector :-))

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.