Sistemas de representación de longitud fija
Representación en coma flotante
En los sistemas de coma fija se representa exclusivamente a números enteros. Para representar a los números reales tenemos la posibilidad de utilizar el sistema BCD, pero no es frecuente por la lentitud en las operaciones aritméticas, y el sistema de coma flotante. Ademas, es común tener que representar números muy pequeños o muy grandes, lo que implica recurrir a un factor de escala (un escalando) para no tener que representar ceros.
Ejemplo
0,0000000125=125*10-10 =0,125*10-7 | |
23450000000=2345*107=0,2345*1011 |
Hasta 1980, cada fabricante
de computadoras tenia su propio formato de coma flotante. Sobra decir que todos
eran diferentes. Peor aún, algunos de ellos de hecho efectuaban operaciones
aritméticas incorrectas debido a que la aritmética de coma flotante
tiene algunas peculiaridades que no resultan obvias para el diseñador
promedio de hardware.
Para rectificar esta situación, a finales de los años 70 IEEE
instituyó un comité para estandarizar la aritmética de
coma flotante, no sólo para permitir el intercambio de datos
de coma flotante entre las diferentes computadoras, sino también para
proporcionar a los diseñadores de hardware de un modelo que supieran
que era correcto. El trabajo resultante condujo a la norma Número 754
del IEEE (IEEE, 1985). Hoy en día, la mayoría de las CPU
tienen un coprocesador de coma flotante y todas ellas se ajustan a la norma
de coma flotante del IEEE. A diferencia de muchos estándares que tienden
a ser compromisos mediocres que no satisfacen a nadie, esta norma no está
mal.
El valor del número viene dado por:
V(X) = M*2E |
Donde M es mantisa y E exponente
de base 2.
En la representación en coma flotante se dividen los n bits,
disponibles para representar un dato, en dos partes, una para la mantisa M (o
fracción) y otra para el exponente E. Considerando que la mantisa tiene
una longitud de p bits y que el exponente la tiene de q bits, se cumple que
n = p + q.
La mantisa contiene los dígitos significativo del dato, mientras que
el exponente indica el factor de escala, en forma de una potencia de base 2.
Considera dos formatos básicos,
el de simple y el de doble precisión, que se representan seguidamente.
El exponente se representa en exceso a 127 para precisión simple y a 1023 en precisión doble.
La mantisa que se representa
es la fracción que queda luego de desplazar la coma detrás del
primer 1. Este primer bit significativo de la mantisa que siempre es 1 no se
representa, esto permite representar un bit más. La coma fraccionaria
de la mantisa se considera después de dicho 1 de la siguiente manera:
1,M.
Por tanto los valores de cada formato son los siguientes:
(-1)s*1,M*2E-127 para 0<E<255 (Los valores para E= 0 y E=255
son
especiales como lo veremos enseguida)
(-1)s*1,M*2E-1023 para 0<E<2047
Obsérvese que se ha colocado la coma a la derecha del dígito más significativo, lo que significa que la normalización es entre 1,0000... y 1,11111...
Ejemplo 1:
Supongamos que queremos representar el número 12,375
Este número debemos pasarlo
a binario. Para ello pasamos primero la parte entera y luego la decimal.
El número binario es: 1100,011
Para representarlo en coma flotante debemos expresarlo en la form 1,M y ajustar
el exponente. En este caso será 1,100011 2 3 o mejor si lo
expresamos todo en binario 1,100011 (10) 11
Ahora la representación es:
Sm (Signo de mantisa) es 0 por ser positivo
El exponente es 11 (3) que en exceso a 127 es 10000010
La mantisa es 100011 (los valores detrás de la coma).
Si formateamos a los 32 bits en campos de 4 bits podemos expresarlos en hexadecimal de la siguiente manera:
Ejemplo 2:
Representar el número -0,005
Convertido a binario es -0,0000000101 = - 1,01 (10)-1000
El signo de mantisa es negativo
por lo tanto el valor es 1
La mantisa 01
El exponente es - 8 +127= 119 en binario es 01110111
Ejemplo 3: En la primer columna están los valores que hemos almacenados
en hexadecimal (8 digitos). En la segunda columna se encuentran el dato que
está representado.
3F
80 0000
|
20*1,000000000...0 = 1.0 |
BF
80 0000
|
-20*1,000000000...0 =-1.0 |
40
00 0000
|
21*1,000000000...0 =2.0 |
3F
00 0000
|
2-1* 1,000000000...0=0,5 |
3F
C00000
|
20* 1,100000000...0=1,5 |
Adicionalmente considera varios casos especiales:
1) E = 0 y M = 0, se emplea
para representar el cero.
2) E = 0 y M distinto de cero, se emplea para representar números pequeños
en forma desnormalizada,
(-1)s*2-127* 0,M
El último caso merece una atención especial. En efecto, para cubrir
el hueco dejado por la representación en coma flotante con mantisa normalizada,
y conseguir una representación cercana al cero, este estándar
emplea la representación no normalizada para E = 0. El rango de las mantisas
no normalizadas es de :
2-127* 0,0000...001 hasta 2-127* 0,1111...1111
o sea 2-127 * 2-23 = 2-150 hasta (aprox) 2-127
*1,0 para precisión simple
o desde 2-1023*
0,0000...001 hasta 2-1023* 0,1111...1111 para precisión doble
Ahora, en el primer caso, se puede obtener un mínimo de 2-150,
que es más cercano al cero.
3) E = 255 y M = 0 indica,
de acuerdo al bit s, valor infinito positivo o negativo.
4) E = 255 y M distinto de 0, se emplea para indicar que el resultado no tiene
sentido (por ejemplo. resultado de 0/0)
Como conclusión expresamos que la representación en coma flotante se utiliza para representar a los números reales. Sin embargo no puede representar a todos ya que estos son infinitos y la capacidad de almacenamiento en coma flotante es finita. El exponente determina el rango de la recta real, es decir los segmentos de ella, mientras que la mantisa determina la precisión (longitud del mínimo intervalo).