Universidad Rey Juan Carlos ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES Circuitos para coma flotante Luis Rincón Córcoles Licesio J. Rodríguez-Aragón Circuitos para coma flotante Programa 1. 2. 3. 4. Bibliografía. Introducción. Suma y resta en coma flotante. Producto y división en coma flotante. Instrucciones para coma flotante en ensamblador. 2 Circuitos para coma flotante Bibliografía  D.A. PATTERSON, J.L. HENNESSY. Estructura y Diseño de Computadores. Reverté, 2000. ÂJ.L. HENNESSY, Kauffman, 2003. D.A. PATTERSON. Computer Architecture. Morgan  DORMIDO, S. CANTO M.A., MIRA J., DELGADO A.E. Estructura y Tecnología de Computadores. 2ª edición. Sanz y Torres, 2000.  PARHAMI, B. Computer Arithmetic. Oxford University Press, 2000.  P. DE MIGUEL. Fundamentos de los Computadores. 7ª edición. Paraninfo, 1999.  W. STALLINGS. Organización y Arquitectura de Computadores. 5ª edición, Prentice Hall, 2000. 3 Circuitos para coma flotante 1. Introducción  Los computadores utilizan dos representaciones claramente diferenciadas para cantidades numéricas: •Coma fija: para números enteros sin signo o complemento a 2. •Coma flotante (floating point, FP): para números muy grandes o muy pequeños o con parte fraccionaria.  Inicialmente cada modelo de computador tenía su propia manera de representar números en coma flotante. •Problemas a la hora de asegurar la transportabilidad de los programas y datos.  En 1977 se formó un comité de expertos del IEEE cuyo objetivo era definir un documento estándar para los futuros desarrollos que utilizaran coma flotante. •Finalmente en 1985 el comité hizo oficial el estándar IEEE 754.  En 1987 otro comité de expertos del IEEE propuso un estándar para coma flotante independiente de la base de numeración utilizada: el IEEE 854. •Este estándar no implica ninguna modificación del IEEE 754. 4 Circuitos para coma flotante Introducción  La coma flotante permite representar los números reales en forma aproximada. •Es preciso aplicar cuidadosamente técnicas de redondeo. •En los programas no se debe testear la igualdad de dos números en coma flotante.  El estándar IEEE 754 permite formatos extendidos para aumentar la precisión: •Simple extendido: mayor precisión que el formato simple y menor que el formato doble. •Doble extendido: mayor precisión que el formato doble. •Trabajar con estos formatos facilita el redondeo.  Dado que la realización de operaciones con datos en coma flotante es compleja, los computadores cuentan con circuitos específicos 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 específicos que, trabajando en paralelo con los microprocesadores, realizaban las operaciones de coma flotante (8087 y sucesivos). •Con los avances en tecnología de integración de circuitos, hace años que los coprocesadores de coma flotante se integran en el chip del microprocesador.  Hay circuitos de coma flotante para operaciones de suma, resta, producto, división, raíz cuadrada, logaritmos, exponenciales, funciones trigonométricas, etc. 5 Circuitos para coma flotante 2. Suma y resta en coma flotante  Lo primero es desempaquetar los operandos (dividirlos en campos).  Después hay que igualar los exponentes de los dos operandos. •Se calcula k =⏐ExpA – ExpB⏐ y se desplaza la mantisa de menor exponente k lugares hacia la derecha.  A continuación, se suman o se restan las mantisas MA y MB. •La mantisa resultante MR puede no estar normalizada. •El exponente resultante ExpR es el mayor de los dos operandos fuente.  Después se normaliza MR y se modifica ExpR si es preciso (postnormalización).  Se comprueba que el exponente resultante está en el rango permitido. •Si ExpR<Expmin ⇒ subdesbordamiento: desnormalizar e ir al paso de redondeo. •Si ExpR>Expmax ⇒ ± infinito: poner valor especial y empaquetar. •En ambos casos podría generarse una excepción.  Se redondea la mantisa MR (en este punto MR se puede desnormalizar). •Si MR se desnormaliza, hay que volver al paso de postnormalización. •Si MR sigue normalizada, empaquetar el resultado (unir los campos) y salir. 6 Circuitos para coma flotante Suma y resta en coma flotante Inicio  En la etapa de inicio hay que desempaquetar los operandos originales. Alinear las mantisas Sumar/restar las mantisas  En la etapa final hay que empaquetar el resultado, respetando los anchos especificados por el estándar y eliminando la parte entera de la mantisa. Normalizar la mantisa resultante ¿Exponente mayor que el máximo? Sí No ¿Exponente menor que el mínimo? No Redondear la mantisa resultante No Sí Infinito positivo o negativo Representar número en forma desnormalizada ¿Todavía está normalizada? Sí Fin 7 Circuitos para coma flotante Suma y resta en coma flotante Sign Exponent Significand Sign Exponent Significand Compare exponents Small ALU Exponent difference 0 1 0 Control 1 0 Shift smaller number right Shift right Big ALU 0 1 0 Increment or decrement Exponent Add 1 Shift left or right Rounding hardware Sign 1 Significand Normalize Round  En función del signo de las mantisas de los operandos y del tipo de operación, el circuito de control seleccionará la UAL grande para realizar una suma o una resta.  La UAL pequeña simplemente resta los exponentes para calcular la longitud del desplazamiento que hay que aplicar a la mantisa del número con menor módulo. 8 Circuitos para coma flotante Suma y resta en coma flotante  Al desempaquetar operandos normalizados es preciso incluir el bit implícito como parte entera de la mantisa, que no estaba almacenado en el dato original. •Como MR ∈ (-4,4), usaremos dos bits para el módulo de la parte entera de las mantisas fuente (que tendrán la forma: s01’...) y para la mantisa resultado.  Dado que el resultado de la operación puede estar desnormalizado, el paso de postnormalización exige un circuito complejo. •El incrementador / decrementador para postnormalizar será un sumador / restador.  La UAL grande tendrá que generar resultados de al menos 1+2+m+t bits: •El primer bit sería el de signo. •Los dos siguientes serían para la parte entera de la mantisa. •Los m siguientes serían para el ancho almacenable de la parte entera de la mantisa. •Los últimos t bits serían para redondear.  La UAL pequeña admitiría operandos de n+1 bits (n: ancho del exponente). 9 Circuitos para coma flotante 3. Producto en coma flotante A = m a ⋅ 2 exp ⎫ ⇒ R = A ⋅ B = (m a ⋅ mb ) ⋅ 2 exp exp ⎬ B = mb ⋅ 2 ⎭ a a + expB b  Lo primero es desempaquetar los operandos (dividirlos en campos).  Después se pueden realizar las dos operaciones siguientes en paralelo: •Sumar los exponentes ExpA y ExpB para obtener ExpR. •Multiplicar las mantisas MA y MB para obtener MR.  Después se normaliza MR ajustando ExpR si es preciso.  Se comprueba que el exponente resultante está en el rango permitido. •Si ExpR<Expmin ⇒ subdesbordamiento: desnormalizar, empaquetar y salir. •Si ExpR>Expmax ⇒ ± infinito: empaquetar y salir. •En ambos casos podría generarse una excepción.  Se redondea la mantisa MR. •Si MR se desnormaliza, hay que volver al paso de normalización. •Si MR sigue normalizada, empaquetar el resultado y salir. 10 Circuitos para coma flotante División en coma flotante A = m a ⋅ 2 exp ⎫ A ⎛m ⎞ ⇒ R = = ⎜⎜ a ⎟⎟ ⋅ 2 exp exp ⎬ B ⎝ mb ⎠ B = mb ⋅ 2 ⎭ a a − expB b  Lo primero es desempaquetar los operandos (dividirlos en campos).  Después se pueden realizar las dos operaciones siguientes en paralelo: •Restar los exponentes ExpA y ExpB para obtener ExpR. •Dividir las mantisas MA y MB para obtener MR.  Después se normaliza MR ajustando ExpR si es preciso (postnormalización).  Se comprueba que el exponente resultante está en el rango permitido. •Si ExpR<Expmin ⇒ subdesbordamiento: desnormalizar, empaquetar y salir. •Si ExpR>Expmax ⇒ ± infinito: empaquetar y salir (¿producir excepción?).  Se redondea la mantisa MR. •Si MR se desnormaliza, hay que volver al paso de normalización. •Si MR sigue normalizada, empaquetar el resultado y salir. 11 Circuitos para coma flotante Producto y división en coma flotante  En la etapa de inicio hay que desempaquetar los operandos originales. Inicio Sumar/restar los exponentes Multiplicar/dividir las mantisas  Habitualmente se trabaja con mantisas normalizadas, para lo cual es necesario: •Normalizar los operandos que estén desnormalizados. •Contar con un bit más para ampliar el rango del exponente.  En la etapa final hay que empaquetar el resultado, respetando los anchos especificados por el estándar y eliminando la parte entera de la mantisa. Normalizar la mantisa resultante ¿Exponente mayor que el máximo? Sí No ¿Exponente menor que el mínimo? No Redondear la mantisa resultante No Sí Infinito positivo o negativo Representar número en forma desnormalizada ¿Todavía está normalizada? Sí Fin 12 Circuitos para coma flotante Producto y división en coma flotante  Las dos operaciones son similares, con lo cual gran parte del circuito para ambas puede ser común: •Un sumador / restador para los exponentes como la UAL pequeña del circuito de suma / resta (sumador para el producto, restador para la división). •Un multiplicador en coma fija que admita operandos fuente de m+1 bits (m: ancho de la mantisa almacenada). •Un divisor en coma fija que admita operandos de m+1 bits.  Si las mantisas están normalizadas se facilita la postnormalización, ya que: •El módulo de la mantisa producto estará en el rango [1,4). •El módulo de la mantisa cociente estará en el rango [1/2,2).  Por tanto, puede ser conveniente normalizar previamente las mantisas fuente que estén desnormalizadas: •A la hora de operar, se añadiría un bit a la representación interna del exponente. 13 Circuitos para coma flotante 4. Instrucciones ensamblador para coma flotante MIPS  Tiene instrucciones de coma flotante, ejecutadas por el coprocesador 1 (que se encuentra dentro del microprocesador).  Los nemotécnicos son similares a las operaciones con enteros con signo, pero con un sufijo indicativo de la precisión de los operandos: •Precisión simple: .s •Precisión doble: .d MC68000  El MC68000 no tiene circuitería para coma flotante.  M68881: coprocesador externo de coma flotante para IEEE 754 de precisión simple y doble. •Tiene un formato interno extendido de 80 bits.  Las instrucciones de coma flotante comienzan por el código 1111. •Producen una excepción de emulación. 14