aritmtica y lgica (coma flotante) scar David Robles Snchez ngel Serrano Snchez de Len Luis Rincn Crcoles Estructura y Tecnologa de Computadores (ITIG) 2 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) Programa 1. Introduccin. 2. Representacin de nmeros en coma flotante. 3. Estndar IEEE 754. 4. Suma en coma flotante. 5. Multiplicacin en coma flotante. 6. La coma flotante y el procesador Pentium. 7. Bibliografa. Conceptos bsicos: Coma flotante, notacin cientfica normalizada, redondeo, estndar IEEE 754, precisin simple/doble, exponente, mantisa, bit implcito, hueco del cero, underflow, NaN (Not a Number), suma en coma flotante, multiplicacin en coma flotante, error FDIV del procesador Pentium. 3 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) 1. Introduccin Hay vida ms all de los nmeros enteros con y sin signo. Utilizacin de los nmeros reales en los lenguajes de programacin. Ejemplos: 3.14159265359 0.718282828282 0.000000001 456.854728945783 En notacin cientfica (tema 3): 0.000000001 = 1.0 10 -9 3155760000 = 3.15576 10 9 1.0 10 -9 est en notacin cientfica normalizada. 0.1 10 -8 10.0 10 -10 no lo estn. 4 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) Los nmeros binarios tambin se pueden expresar en esta notacin: 1.0 2 -1 Se necesita una base que permita incrementar o decrementar el exponente en la misma proporcin que el nmero de bits necesarios para desplazar el nmero dejando un nico dgito distinto de 0 a la izquierda de la coma decimal. La parte aritmtica que trata estos nmeros se llama de coma flotante (floating point). El lenguaje C usa el tipo de datos float para representar estos nmeros. El formato es: 1.xxxxxxx 2 yyyy Slo hay un dgito no nulo a la izquierda de la coma binaria. 2. Representacin de nmeros en coma flotante 5 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) La coma flotante no es una representacin exacta para nmeros reales, sino que nicamente permite representar los nmeros reales en forma aproximada. Es preciso aplicar cuidadosamente tcnicas de redondeo. En los programas no se debe testear la igualdad de dos nmeros en coma flotante. Dado que la realizacin de operaciones con datos en coma flotante es compleja, los computadores cuentan con circuitos especficos dedicados a ello. Los computadores de potencia baja trabajaban en coma flotante mediante software. Con el microprocesador 8086 de Intel surgieron los coprocesadores de coma flotante: chips especficos que, trabajando en paralelo con los microprocesadores, realizaban las operaciones de coma flotante (8087 y sucesivos). Con los avances en tecnologa de integracin de circuitos, hace aos que los coprocesadores de coma flotante se integran en el chip del microprocesador. 6 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) 3. Estndar IEEE 754 Precisin simple (32 bits): Signo (1 bit) y Mantisa (23 bits+ 1 bit implcito), expresados en binario signo- magnitud. El bit implcito siempre vale 1 y no se almacena. Exponente (8 bits), expresado en binario exceso a 127. Rango: [3.403810 38 , 1.175510 38 ] U {0} U [1.175510 38 , 3.403810 38 ] 28 27 26 25 24 23 MANTISA 22 EXPONENTE S 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 29 30 31 Hueco del cero (underflow) 7 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) (1) s 1.m 2 exp127 si 0 < exp < 255 (1) s 0.m 2 126 si exp = 0 (caso desnormalizado) 0 si exp = m = 0 + si exp = 255, m = 0, s = 0 si exp = 255, m = 0, s = 1 NaN (Not a Number) si exp = 255, m 0 N = donde: s = signo de la mantisa m = mdulo de la mantisa almacenada (sin bit implcito) exp = exponente almacenado (sin descontar exceso) 8 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) MANTISA MANTISA (CONTINUACIN) 28 27 26 25 24 23 22 EXPONENTE S 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 29 30 31 Precisin doble (64 bits): Signo (1 bit) y Mantisa (52 bits+ 1 bit implcito), expresados en binario signo- magnitud. El bit implcito siempre vale 1 y no se almacena. Exponente (11 bits), expresado en binario exceso a 1023. Rango: [1.797710 308 , 2.225110 308 ] U {0} U [2.225110 308 , 1.797710 308 ] Hueco del cero (underflow) 9 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) (1) s 1.m 2 exp1023 si 0 < exp < 2047 (1) s 0.m 2 1022 si exp = 0 (caso desnormalizado) 0 si exp = m = 0 + si exp = 2047, m = 0, s = 0 si exp = 2047, m = 0, s = 1 NaN (Not a Number) si exp = 2047, m 0 N = donde: s = signo de la mantisa m = mdulo de la mantisa almacenada (sin bit implcito) exp = exponente almacenado (sin descontar exceso) 10 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) Ejemplo: Base 10 IEEE 754 (prec. simple) N = 0.75 10 1. Expresarlo en binario: 0.75 10 = 0.11 2 2. Normalizar: 0.11 2 = 1.1 2 2 1 3. Clculo del exponente en exceso: exp = 1 10 + 127 10 = 126 10,exc.127 = 01111110 2,exc.127 4. Clculo de mantisa: m = 1.10000000000000000000000 (el bit implcito no se almacena) 5. Bit de signo: s = 1 (n negativo) 6. Representacin en precisin simple: 7. Representacin en notacin compacta hexadecimal: N = 1011 1111 0100 0000 0000 0000 0000 0000 2,IEEE754,s = BF400000 16,IEEE754,s 1 1 1 1 1 0 MANTISA 1 EXPONENTE S 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 11 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) Ejemplo: IEEE 754 (prec. simple) Base 10 N = C0A00000 16,IEEE754,s = 1100 0000 1010 0000 0000 0000 0000 0000 2,IEEE754,s 1. Bit de signo: s = 1 (n negativo) 2. Exponente: exp = 10000001 2,exc.127 = 129 10,exc.127 = 129 10 127 10 = 2 10 3. Mantisa: 1.0100000000000000000000 2 = 2 0 + 2 2 = 1.25 10 4. Resultado: N = 1.25 2 2 = 5 10 s exp m 12 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) 4. Suma en coma flotante 9.999 10 1 + 1.610 10 -1 = ? 4 cifras decimales para la mantisa. 2 para el exponente. Paso 1: Alinear mantisas 1.610 10 -1 = 0.01610 10 1 0.016 10 1 Paso 2: Sumar mantisas 9.999 + 0.016 = 10.015 Suma = 10.015 10 1 Paso 3: Normalizar resultado 10.015 10 1 = 1.0015 10 2 Paso 4: Redondear resultado Resultado final = 1.0015 10 2 1.002 10 2 13 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) Diagrama de bloques de una ALU dedicada a la suma en coma flotante: 14 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) 5. Multiplicacin en coma flotante 1.110 10 10 9.200 10 -5 = ? 4 cifras decimales para la mantisa. 2 para el exponente. Paso 1: Sumar exponentes Exponente = 10 + (5) = 5 Paso 2: Multiplicar mantisas 1.110 9.200 = 10.212 Paso 3: Normalizar resultado 10.212 10 5 = 1.0212 10 6 Paso 4: Redondear resultado 1.0212 10 6 1.021 10 6 Paso 5: Colocar signo Resultado final = +1.021 10 6 15 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) 6. La coma flotante y el procesador Pentium El Pentium utiliza algoritmo estndar de divisin en coma flotante, que genera mltiples bits del cociente paso por paso. Utiliza los bits ms significativos del divisor y el dividendo para estimar los siguientes 2 bits del cociente a travs de una tabla de prediccin. Si una estimacin previa lleva a un resto demasiado grande, su valor se reajusta en el siguiente paso. En el 80486 la tabla de prediccin tena 5 elementos que Intel pens que no se utilizaran en el Pentium. Se devolvera 0 en lugar de 2 en esas posiciones. ERROR: los 11 primeros bits eran siempre correctos, pero no del 12 al 52. 16 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) Julio 1994: Intel descubre el error. Coste real de cientos de miles de dlares. Estimacin de fabricacin de 3 a 5 millones de procesadores con el error. Septiembre 1994: Thomas Nicely del Lynchburg College de Virginia descubre el error. No hay reaccin oficial de Intel. Introduce su descubrimiento en Internet. 7 noviembre 1994: Portadas en los principales peridicos financieros. 22 noviembre 1994: Pequeo error que afecta a slo un grupo de usuarios tipo matemticos tericos (segn Intel). 5 diciembre 1994: El error se produce una vez cada 27000 aos para usuarios habituales de hojas de clculo (segn Intel). 12 diciembre 1994: IBM demuestra una probabilidad de error mucho mayor y detiene la produccin de nuevos PCs basados en Pentium. 21 diciembre 1994: Intel pide disculpas. Los analistas sitan el coste de esta operacin en 300 millones de dlares. El error FDIV de Pentium 17 Tema 14. Construccin de una unidad aritmtica y lgica (coma flotante) 7. Bibliografa D.A. PATTERSON, J.L HENNESSY. Computer Organization and Design. Morgan Kaufmann, 2005. D. A. PATTERSON, J. L. HENNESSY. Estructura y diseo de computadores. Revert, 2000. DORMIDO, S. CANTO M.A., MIRA J., DELGADO A.E. Estructura y Tecnologa de Computadores. 2 edicin. Sanz y Torres, 2000. D. A. PATTERSON, J. L., HENNESSY. Computer Organization and Design. Morgan Kaufmann, 2005. J.M. ANGULO, J.GARCA. Sistemas Digitales y Tecnologa de Computadores. Paraninfo, 2002. P. DE MIGUEL. Fundamentos de los Computadores. 7 edicin. Paraninfo, 1999. W. STALLINGS. Organizacin y Arquitectura de Computadores. 5 edicin, Prentice Hall, 2000.