22/03/2012 La división es una de las operaciones menos frecuentes. Revisemos la forma de ejecutarla Arquitectura de Computadoras Primavera 2012 Divisor 1 0 0 1 Cociente 1 0 0 0 1 0 0 1 0 1 0 Dividendo - 1 0 0 0 1 0 1 0 1 1 0 1 0 - 1 0 0 0 1 0 La relación entre los componentes de la división es la siguiente: Dividendo Cociente Divisor Resto El resto es menor que el cociente En la división se debe tener cuidad con la división por cero que causa un error matemático Resto No hay forma de saber de antemano si el divisor es mas pequeño que el dividendo Por lo cual, el divisor se resta del dividendo y si el resultado es Positivo (mayor o igual que cero), ▪ Se produce un 1 en el cociente Negativo (men0r que cero), ▪ Se regresa al número original por medio de sumar el divisor y se produce un cero en el cociente Inicio 1. Resta el divisor del resto y pon el resultado en el registro del resto Resto ≥ 0 Iteración 0 Resto < 0 Prueba el Resto 2b. Restaura el valor original por medio de sumar el divisor al resto y pon el resultado de la suma en el registro del resto. También, recorre el registro del cociente a la izquierda y pon el LSB a cero 2a. Corre el registro del cociente a la izquierda, pone el bit mas a la derecha a 1 1 2 3 3. Corre el registro del divisor a la derecha 1 bit 4 No Repetición 33? Si Fin 5 Cociente Divisor Resto Valores iníciales 0000 0010 0000 0000 0111 1: Resto = Resto – Div Paso 0000 0010 0000 1110 0111 2b: Resto < 0 +Div, sll Q, Q0 = 0 0000 0010 0000 0000 0111 3: Corre Div a la derecha 0000 0001 0000 0000 0111 1: Resto = Resto – Div 0000 0001 0000 1111 0111 2b: Resto < 0 +Div, sll Q, Q0 = 0 0000 0001 0000 0000 0111 3: Corre Div a la derecha 0000 0000 1000 0000 0111 1: Resto = Resto – Div 0000 0000 1000 1111 1111 2b: Resto < 0 +Div, sll Q, Q0 = 0 0000 0000 1000 0000 0111 3: Corre Div a la derecha 0000 0000 0100 0000 0111 1: Resto = Resto – Div 0000 0000 0100 0000 0011 2a: Resto ≥ 0 sll Q, Q0 = 1 0001 0000 0100 0000 0011 3: Corre Div a la derecha 0001 0000 0010 0000 0011 1: Resto = Resto – Div 0001 0000 0010 0000 0001 2a: Resto ≥ 0 sll Q, Q0 = 1 0011 0000 0010 0000 0001 3: Corre Div a la derecha 0011 0000 0001 0000 0001 1 22/03/2012 El resultado final es: Cociente: 0011 = 3 Corrimiento derecho Divisor 64-bits Resto: 0000 0001 = 1 64-bit ALU 32-bits Dividendo Cociente Divisor Resto 64-bits Resto 7 3 2 1 Cociente Por lo cual el resultado cumple con: La división con signo requiere que se indique cual es el signo del resto Control Corrimiento derecho Analicemos que pasa con 7 ÷ 2 En este caso el cociente es 3 para determinar el resto usamos la siguiente formula Dividendo Cociente Divisor Resto Resto Dividendo Cociente Divisor Recuerden que la siguiente ecuación siempre se debe cumplir: Analicemos los casos cuando tenemos ±7 y ±2 Resto = 7 – (3 × 2 ) = 1 Ahora si tomamos el caso -7 ÷ 2 El cociente es -3 Resto = -7 – (-3 × 2 ) = -7 – (-6) = -7+6 = -1 Checando el resultado 7 = (-3 × 2 ) + (-1) = -6 -1 Sin embargo los siguientes números también satisfacen la formula Cociente = -4 resto = +1 Checando el resultado -7 = (-4 × 2 ) + (+1) = -8 + 1 Para evitar este comportamiento anómalo se toma como regla que el dividendo y el resto siempre deben tener el mismo signo Cociente y Resto Comprobando +7 ÷ +2 Caso Cociente = +3, Resto = +1 7 = 3 × 2 + (+1) =6+1 -7 ÷ +2 Cociente = -3, Resto = -1 -7 = -3 × 2 + (-1) = -6 – 1 +7 ÷ -2 Cociente = -3, Resto = +1 7 = -3 × (-2) + (+1) = 6 + 1 -7 ÷ -2 Cociente = +3, Resto = -1 -7 = 3 × (-2) + (-1) = -6 – 1 Por lo tanto, el algoritmo de división con signo debe: • Negar el cociente si los signos del dividendo y divisor son diferente • Hacer el signo del resto y el dividendo sean iguales 2 22/03/2012 El hardware para la multiplicación puede servir para realizar la división también. Instrucción Ejemplo Sobreflujo División por cero. Esta debe ser prevenida por software Arquitectura de Computadoras Primavera 2012 Comentario División con signo div $s1,$s2 Divide el contenido del Lo = $s2/$s3 registro S1 entre el registro S2 Hi = $s1 mod $s2 . El cociente es almacenado en Lo y el resto en Hi División sin signo divu $s1,$s2 Divide el contenido del registro S1 entre el registro Lo = $s2/$s3 S2. Asume que ambos Hi = $s1 mod $s2 números son sin signo. El cociente es almacenado en Lo y el resto en Hi Mueve desde Hi mfhi $s1 $s1 = Hi Obtiene el resto de la división Mueve desde Lo mflo $s2 $s2 = Lo Obtiene el cociente de la división Por lo cual MIPS ofrece la oportunidad de realizar divisiones Sin embargo, el hardware para la división no distingue: significado Los números de punto flotante nos ayudan a representar números reales tales como: pi = 3.1416 e = 2.71828 3,1555,760,000 = 3.15576 × 109 Los números flotantes se encuentran expresados en notación científica Los números en notación científica que no tienen ceros al principio son denominados números normalizados, ejemplo: 1.0025 × 109 Esta misma notación puede ser empleada para los números binarios 1.0 × 2-1 Los números flotantes nos ayudan a representar números muy pequeños o números muy grandes que no podrían ser representados como números enteros Estos números son llamados números de punto flotante porque representan números donde el punto binario no esta fijo. Estos números tienen el siguiente formato: 1.yyyyy × 2xxxxx Este formato ofrece los siguientes beneficios: Simplifica el intercambio de información Simplifica los algoritmos aritméticos Incrementa la exactitud de los números almacenados en un palabra 3 22/03/2012 La representación de punto flotante debe encontrar un balance entre la fracción y el exponente Este balance es entre la precisión y el rango Incrementar el tamaño de la fracción incrementa la precisión Incrementar el exponente incrementa el rango de 1S F 2E 31 30 – 23 22 - 0 signo Exponente Fracción 1 bit 8 bits 23 bits Esto permite que en MIPS podamos representar números tan pequeños como 2×10-38 y números tan grande como 2×1038 Los números de punto flotantes presentan otra evento además del sobreflujo. El sobreflujo se produce cuando se quiere representar un número muy grande. Sin embargo, el underflow se produce cuando se requiere representar un número muy pequeño. El underflow se produce cuando el exponente negativo es muy grande para ser representado dentro del campo del exponente Una estrategia para poder decrementar la probabilidad de que existan tanto sobreflujos como underflow es un segundo formato con un campo de exponente mas amplio Precisión simple Este formato se le conoce como número de punto flotante de doble precisión. los números que pueden ser representados Los números en punto flotante en MIPS son representados de la siguiente manera: Los números de punto flotante nos ayudan a representar números muy grandes, pero existe la posibilidad de requerir un número mayor al que puede ser representado El sobreflujo en los números flotantes indica un número en el que su exponente es muy grande para ser representado dentro del campo del exponente (8-bits) En C se distingue entre precisión simple y doble por medio de usar las palabras reservadas float y double Signo: 1 bit Exponente: 8 bits 32 bits Fracción: 23 bits Precisión doble Signo: 1 bit Exponente: 11 bits 64 bits Fracción: 52 bits 4 22/03/2012 El estándar para números de punto flotante es conocido como: IEEE 754 El estándar define al numero de punto flotante de la siguiente manera: 1Signo 1 Fraccion 2E Bias Represente el numero 9.75 9.7510 = 1001.112 9.7510 = 1.001112 × 23 Por lo que en su representacion en formato IEEE 754 es: 10 1 .00111 2130127 donde el bias = 127 para precisión simple y 1023 para doble precisión 10 1 .00111 2130127 Considere los números 9.999×101 y 1.610×10-1 asuma que solo se pueden usar 3 dígitos para la parte fraccionaria y uno para la parte entera Paso 1: Para poder sumarlos, primero debemos alinear el Por lo que el numero es: punto decimal en ambos números quedando ▪ 9.999×101 y 0.016×101 31 30 – 23 22 - 0 signo Exponente Fracción 0 1000 0010 001 1100 0000 0000 0000 0000 Paso 2: Enseguida sumamos los números sin su exponente: Signo Exponente 9 . 9 9 9 + 0 . 0 1 6 1 0 . 0 1 5 Fracción Signo Exponente Fracción ALU Paso 3: Sin embargo, el numero no esta expresado en notación científica normalizada. Por lo cual deberá ser normalizado 10.015×101 se normaliza a 1.0015×102 Paso 4: Solo se pueden representar 3 dígitos en la parte fraccionaria así que el numero se redondea a: 1.002×102 0 Diferencia de Exponentes 0 1 1 Shift Der. 0 1 Control 0 ALU 1 0 Incremento o Decremento 1 Shift Der. o Izq Hardware de Redondeo Signo Exponente Fracción 5 22/03/2012 Considere la multiplicación de los números 1.110×1010 y 9.200×10-5 El producto no se encuentra normalizado, por lo que se debe normalizar Paso 1: Los exponentes deben ser sumados ▪ 10.212 × 105 = 1.0212 × 106 ▪ Nuevo exponente = 10 + (-5) = 5 × 1 1. 1 1 0 9. 2 0 0 0 0 0 0 0 0 0 0 2 2 2 0 9 9 9 0 0. 2 1 2 0 Paso 4: Asumiendo que solo podemos representar 3 dígitos de la Paso 2: Enseguida se realiza la multiplicación de la parte significativa Paso 3: parte fraccionaria, debemos redondear el número ▪ 1.021 × 106 Paso 5: Establecer el signo del resultado. El signo se establece en base a los operandos, si los operandos tiene signos diferentes, el resultado es negativo, de lo contrario es positivo ▪ +1.021 × 106 0 0 6