Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Coma Flotante PDF
Coma Flotante PDF
Introducción.
Hasta ahora hemos visto algoritmos aritméticos para realizar operaciones sobre
representaciones de números en coma fija. Todos ellos se pueden utilizar para las representaciones en
coma flotante a condición de tener en cuenta el escalado, es decir, conocer la posición correcta del
punto donde se localiza la separación entre la parte entera y la parte decimal.
Pero en el computador, todo dato debe ser almacenado en un registro con un número finito de
bits. Y la pregunta es ¿cómo almacenamos los datos en coma flotante?.
La respuesta ha esta pregunta comienza preguntándonos primero si es necesaria la notación en
coma flotante en los ordenadores, y si se implementa ¿con que características?. John Von Newmann
rechazo incluir la aritmética en coma flotante en la máquina que construyo en Princentom. Y durante
muchos años, cada fabricante y prácticamente cada computador utilizaban una aritmética distinta.
El hardware de punto flotante se popularizó al comenzar a ser de utilidad hacia 1957 en el que
una unidad decimal de punto flotante estuvo disponible en el IBM 650, y pronto las series IBM 704,
709, 7090, 7094, etc ..., ofrecieron hardware binario de punto flotante para simple y doble precisión.
Como consecuencia se disponía ya de punto flotante en gran parte de computadores, pero cada
implementación era diferente.
Sobre 1976 John F. Palmer en Intel comienza el desarrollo de una aritmética de punto flotante
para toda la línea de productos de Intel. La aparición del 8086 era inminente, y se estaba
contemplando la opción de incorporar un coprocesador de punto flotante, el 8087, para el 8086. El
coprocesador era un chip adicional que aceleraba una parte del trabajo del procesador, en este caso
los cálculos en punto flotante. En aquellos tiempos las aritméticas de punto flotante eran ligeramente
diferentes entre los grandes computadores pero una verdadera anarquía entre los microcomputadores,
en los que era necesario albergar una docena de aritméticas diversas en el firmware de la ROM o vía
software. Robert G. Stewart, un ingeniero de la IEEE trató de controlar esta anarquía reinante y
propuso que el IEEE diseñase un estándar aceptable de punto flotante.
Las reuniones de este comité en referencia al punto flotante comenzaron a finales de 1977 con
multitud de borradores que provenían de innumerables fuentes y se alargaron hasta 1985 cuando se
hizo oficial el Standard 754 del IEEE para punto flotante binario, basado en el diseño inicial de
Intel, pero algo simplificado.
En 1980 Intel harta de esperar lanza el 8087 para su uso en el Ibm Pc, paralelamente Motorola
anuncia en 1982 su 68881, utilizado en el Sun 3 y el Macintosh II, al mismo tiempo de estos
lanzamientos el estándar finalmente apareció.
La mantisa M suele ser una representación en complemento a 2 (con signo). La precisión de las
representaciones numéricas va a depender del número de bits que utilicemos para la mantisa. Por ello
es fundamental que la mantisa tenga el mayor número de bits significativos, para lo cual se debe
normalizar. La normalización de la mantisa en base 2 se consigue desplazando hacia la izquierda la
mantisa hasta que el bit a la derecha del punto de la raíz sea uno (o el de la izquierda). Por ello, al
colocar el primer uno a la derecha del punto decimal, tendremos que la magnitud de la mantisa en
valor absoluto tiene un valor dentro del rango:
½ |m| 1
Exponente.
Es un número de p bits que utiliza una representación exceso 2p-1 por las razones que vamos a
exponer.
a) El 0 se podría representar como M=0 y cualquier valor de exponente. Pero puede ocurrir
que al realizar operaciones aritméticas, a causa de los errores de redondeo, apareciera algún 1
en posiciones menos significativas de la mantisa.
Esto sugiere que el exponente más adecuado para representar el 0 es aquel que tiene el mayor
valor negativo.
De esta forma, se logra que los errores de redondeo de la mantisa, den un número tan próximo
a cero como sea posible.
b) La representación del 0 es una secuencia de 0`s tanto en la mantisa como en el exponente,
de esta forma tenemos una única representación del cero.
Suma y Resta.
Cuando sumamos o restamos dos números en coma flotante se deben comparar los exponentes y
hacerlos iguales, para lo cual hay que desplazar o alinear uno de ellos respecto al otro. Dados dos
números en representación en coma flotante como
x = mx 2xe y = my 2ye
las operaciones de suma y resta se definen de la siguiente forma, suponiendo que xe < ye:
x = 737 y = 267337
Pásalos a notación exponencial y calcula y-x =
Expresa el resultado de forma normalizada
Ejemplo:
Sean x e y los siguientes números en base-2
x = 11000 y = 1010000
Los pasamos a notación exponencial y realizamos las operaciones: x+y y x-y.
X-Y:
Problema:
Sean x e y los siguientes números en base-2
x = 1110101 y = 11101
Pasarlos a notación exponencial y realiza las operaciones: x+y, y-x y x-y.
Importante en este caso: expresa el resultado de forma normalizada.
Las operaciones de suma y resta, así como la multiplicación y la división pueden producir
reboses, por producir resultados demasiado grandes (desbordamientos) o demasiado pequeños
(subdesbordamientos). Hay cuatro tipos de reposes posibles:
1) Desbordamiento del exponente. Es cuando un exponente positivo E excede de su valor máximo
permitido. En algunos ordenadores el número X se representa entonces como + o - .
2) Subdesbordamiento del exponente. Es cuando un exponente negativo E excede de su valor
máximo permitido. Esto significa que el numero X es demasiado pequeño y se puede considerar
como igual a 0.
3) Subdesbordamiento de mantisa. En el proceso de alineación de las mantisas, si los dígitos se
desplazan hacia la derecha más allá de su bit menos significativo, lo que sucede es que se pierden y
es como redondear el resultado.
4) Desbordamiento de mantisa. En la suma de dos mantisas del mismo signo se puede producir un
arrastre del bit más significativo. Esto se soluciona mediante la renormalización, desplazando a la
derecha un bit la mantisa y ajustando el exponente.
La precisión de la representación en coma flotante no posee la misma precisión en toda la
recta Real. En la figura siguiente se puede apreciar como podemos representar con más precisión o
Vicente Arnau Llombart 12/11/2010
Ampliación de Estructura de Computadores Curso 2010-2011
con mayor densidad de números, al acercarnos al cero. Y perdemos precisión al alejarnos hacia más
o menos infinito.
Algoritmo de la suma-resta.
Por lo visto con anterioridad, para realizar la suma (resta) de dos operandos en representación coma
flotante debemos realizar previamente la separación de los exponentes y de las mantisas para su
tratamiento posterior, y después realizar esta serie de pasos:
1. Seleccionar el número con menor exponente y desplazar su mantisa a la derecha tantas veces
como indique la diferencia en módulo de los exponentes.
2. Hacer que el exponente resultado sea igual al mayor de los exponentes.
3. Realización de las operaciones de suma o resta con las mantisas.
4. Normalización del resultado. Una vez realizada la suma se debe normalizar desplazando los
bits de la mantisa hacia la izquierda o la derecha con lo cual habrá que cambiar el valor del
exponente.
5. Comprobar las condiciones de rebose.
Un diagrama de flujo del algoritmo se muestra en la figura de la página siguiente. Se utilizan los
mismos registros que para el caso de la suma resta, y el resultado final que almacenado en los
registros A y E.
Multiplicación y división.
La multiplicación y la división en punto flotante son más sencillas de realizar. Vemos la formula que
nos permitirá realizar estas operaciones manualmente:
Las Unidades aritméticas en como flotante de los computadores se construyen utilizando dos
unidades aritméticas en como fija:
- Unidad de tratamiento de mantisas.
- Unidad de tratamiento de exponente.
Mas una Unidad de Control que conectará
ambas unidades y que se encarga entre otras
cosas de normalizar adecuadamente el
resultado.
IEEE 754
Simple Precisión
El estándar IEEE-754 para la representación en simple precisión de números en coma flotante exige una
cadena de 32 bits. El primer bit es el bit de signo (S), los siguientes 8 son los bits del exponente (E) y los
restantes 23 son la mantisa (M):
Al estar el dato normalizado, es decir expresado siempre como “1,…” (“uno coma algo más”), el 1
de la parte entera no se almacena, aunque nunca debemos olvidarnos que existe.
El signo de la mantisa está representado en el bit 31.
El campo del exponente (ne) dispone de 8 bits, empezando por el bit 23 hasta el bit 30.
El campo de mantisa (nm) dispone de 23 bits, empezando por el bit 0 hasta el bit 22.
Considerando el valor 1 implícito (oculto) para el primer bit de los números binarios
normalizados la precisión del campo de la mantisa es de 24 bits.
El valor del desplazamiento es de 127, es decir el exceso C = 2 7-1 = 127.
Estos tamaños de exponente y mantisa dan a la aritmética del computador un rango que cubre
fracciones tan pequeñas como 2.0 diez x 10 -38 y números tan grandes como 2.0 diez x 10 38.
El valor V representado por esta cadena puede ser determinado como sigue:
Si E=255 y M es no nulo, entonces V=NaN ("Not a number")
Si E=255 y M es cero y S es 1, entonces V=-Infinito
Si E=255 y M es cero y S es 0, entonces V=Infinito
Si 0<E<255 entonces V=(-1)**S * 2 ** (E-127) * (1.M)
donde "1.M" se emplea para representar el número binario creado
por la anteposición a M de un 1 y un punto binario.
Si E=0 y M es no nulo, entonces V=(-1)**S * 2 ** (-126) * (0.M)
Estos son valores "sin normalizar".
Si E=0 y M es cero y S es 1, entonces V=-0
Si E=0 y M es cero y S es 0, entonces V=0
En particular,
0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0
Doble precisión
El estándar IEEE-754 para la representación en doble precisión de números en coma flotante exige una cadena
de 64 bits. El primer bit es el bit de signo (S), los siguientes 11 son los bits del exponente (E) y los restantes
52 son la mantisa (M):
El campo de mantisa (nm) dispone de 52 bits, empezando por el bit 0 hasta el bit 51.
Considerando el valor 1 implícito (oculto) para el primer bit de los números binarios
normalizados la precisión del campo de la mantisa es de 53 bits.
El valor del desplazamiento es de 1023,es decir el exceso C = 2 10- 1 = 1023.
Estos tamaños de exponente y mantisa dan a la aritmética del computador un rango que cubre
fracciones tan pequeñas como 2.0 diez x 10 -308 y números tan grandes como 2.0 diez x 10 308.
El valor V representado por esta cadena puede ser determinado como sigue:
Precisión Extendida
Este formato suele reservarse normalmente para almacenar resultados intermedios, su longitud extra
le permite proteger los resultados finales del redondeo y los cálculos intermedios del overflow y
underflow. El bit implícito de los anteriores formatos aquí no se contempla, ya que se encuentra
físicamente presente en la mantisa.
00010011
+01111111
10010010 entonces el número vale:
4 9 5 1 0 0 0 0
Redondeo.
Cuando tenemos un valor no representable, se aproxima a uno de estos 4 casos:
- Redondeo hacia el valor más próximo.
- Redondeo hacia +∞
- Redondeo hacia -∞
- Redondeo hacia 0.
Bit de guarda.
Cualquier operación aritmética se realiza sobre formatos ampliados. De esta forma ganamos
precisión en la realización de las operaciones aritméticas.
Veamos un ejemplo de la importancia de utilizar representaciones ampliadas, o bits de guarda:
X = 1,00 ... 00 * 21
Y = 1,11 ... 11 * 2o
X-Y X: 1,00 . . . 00 * 21
Y: - 0,11 . . . 11 * 21 (mantisa un bit a la derecha)
0,00 . . . 01 * 21
(17.25)SP = Ox 4 1 8 A 0 0 0 0
En doble precisión:
(17.25)DP = Ox 4 0 3 1 4 0 0 0 0 0 0 0 0 0 0 0
Paso 1: E = E1-E2 = 100 – 110 = -10 pero es mejor así, usando Complemento-2:
E = E + 1 = -10 + 1 = -1
E = 11111110+(1) = 11111110 + 00000001 = 11111111
E = E + 1 = -1 + 1 = 0
E = 11111111+(1) = 11111111 + 00000001 = 00000000
E<0 no E>0 no
Paso 3: A=A+M
A : 0.011
+ 1.01
1.101
A Rebose? NO
A = 0 ? NO
A Normalizado ??? SI
FIN :
X+Y = 0 10000101 1010000000 . . . 00
X+Y = 0x42D00000
Paso 2: A = A * M
1.1
* 1.01
11
00
11
1.111
E Rebose ? NO
A = 0 ? NO
A Normalizado ? SI
FIN :
X*Y = 0 10001001 1110000000 ... 00
X * Y = 0x44F00000
Comprobación:
Paso 1: E = E1-E2 = 110 - 100 = 010 pero es mejor hacerlo de esta forma:
Paso 2: A=A/M
1.01 1.1
10 0 0.1101010101...
1 00
...
E Rebose ? NO
A=0? NO
A Normalizado ¿? NO :
A = 1.10101010101010...
E = E – 1 = 10000000
FIN :
Y/X = 0x40555555
P7) Representar el número X = -56.320 en formato S.P. y D.P. según la norma IEEE-754.
Resultado en S. P. : 0xC26147AE
Resultado en D. P. : 0xC04C28F5C28F5C29