23/11/11

otra de bits (2)

no se que significa. cosas de informáticos. pero mola mil. teraflop. -- meri la ligarta, insigne escritora.


imagina que tenemos un ordenador que puede almacenar números usando tan solo seis dígitos. como es un ordenador imaginario, los dígitos no serán los bits dichosos, sino los números decimales de toda la vida, del cero al nueve, y también un signo que puede ser positivo o negativo. como es nuestro ordenador y nos lo f*ll*m*s si queremos, decidimos que usaremos tres dígitos para almacenar la parte entera, dos dígitos para almacenar la parte decimal y el dígito que falta para almacenar el signo del número.

pues ya no hace falta nada más, hemos almacenado nuestro número en un formato llamado coma fija. obviamente, la “coma” no hace falta almacenarla, porque siempre sabemos donde esta situada.


fíjate ahora que el número positivo más grande que podemos representar es el 999,99. y que el numero positivo más pequeño (distinto de cero) que podemos representar es el 0,01. es un rango bastante pobre, así que vamos a ver si podemos recurrir a algunos trucos matemágicos para mejorar la representación numérica de nuestro ordenador.

el primer paso es dividir nuestro número por diez, cien o mil, para desplazar la coma de la cifra decimal delante del primer dígito del número. además, para que el número siga siendo el mismo, tenemos que multiplicarlo por ese múltiplo de diez concreto.

81,74 = 0,8174·100


el segundo paso es recordar de nuestro bachillerato que podemos expresar cualquier múltiplo de diez como una potencia de diez

81,74 = 0,8174·10^2



¡y ya no hace falta nada más! solo tenemos que almacenar los números decimales y el exponente para representar nuestro número. aquí también, tanto el “cero coma” como el “por diez elevado a la” no necesitamos almacenarlos, porque siempre sabemos donde están. pero ojo, ¡ahora nuestro exponente también puede tener un signo! así que en esta nueva representación, llamada coma flotante, usaremos un dígito para el signo, tres dígitos para la parte significativa, un dígito para el signo del exponente, y un dígito para el exponente.


podemos comprobar que el número positivo más grande en esta representación es el 0,999·10^+9 que equivale a 999000000 mientras que el más pequeño es el 0,001·10^-9 que es igual a 0,000000000001. hemos incrementado nuestro rango, ¡y como! lo de coma flotante viene porque, para una misma parte significativa, si incrementamos o decrementamos el exponente la coma se va desplazando en su posición.

0,817·10^+3=817
0,817·10^+2=81,7
0,817·10^+1=8,17
0,817·10^+0=0,817
0,817·10^-1=0,0817
0,817·10^-2=0,00817


por supuesto que hay una trampa en todo esto: aumentamos el rango pero perdemos precisión. si en coma fija teníamos 81,74, en coma flotante se convierte en 0,817·10^+2. así que necesariamente perdemos el cuatro del último dígito. la manera de apañar -que no arreglar- la pérdida de precisión es dimensionar correctamente cuantos dígitos damos a la parte significativa y cuantos damos al exponente. todo esto se regula en una norma llamada IEEE 754 que, por ejemplo, para numeros almacenados con 32 bits asigna 1 al signo, 23 a la parte significativa, 7 al exponente y 1 al signo del exponente.

y aunque hacer operaciones matemáticas en coma flotante, los benditos flops, sea más complejo que hacerlo con coma fija, es un precio que se paga por aumentar el rango de representación de los números con un ordenador*.

para que luego digan que el tamaño no importa.

* hay un detalle que permite aumentar ligeramente el rango de representación si eres muy pijotero: ¡el cero esta representado dos veces!