ELO311 Estructuras de Computadores Digitales Números Tomás Arredondo Vidal Este material está basado en: material de apoyo del texto de David Patterson, John Hennessy, "Computer Organization & Design", (segunda y tercera edición), Morgan Kaufmann, CA. 2005 material del curso anterior ELO311 del Prof. Leopoldo Silva www.wikipedia.org Números Los primeros números conocidos se remontan a 30000 AC. Se han descubierto huesos y cavernas con marcas en ellos indicando cuentas como por ejemplo de dias que elapsan o de cantidades (e.g. animales). Pintura de Caverna en Lascaux Francia en el Paleolitico (40000-10000AC) En general, un número es una secuencia de dígitos. En sistemas posiciónales y ponderados, la posición que ocupa un dígito, en la secuencia, representa las veces que está presente la potencia de la base numérica correspondiente. Marcas Numéricas NSW, Australia (20000-3000AC) Números Sea b la base numérica y di un elemento perteneciente al conjunto Db de los dígitos del sistema numérico. Db está formado por b símbolos, con valores consecutivos, en los que está incluido el cero. Db = { 0, 1, …, (b-1) }, di ϵ Db Ejemplos: b = 2 (binario) b = 8 (octal) b = 10 (decimal) b = 16 (hexadecimal) → D2 = { 0, 1} → D8 = {0, 1, 2, 3, 4, 5, 6, 7} → D10 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} → D16 = {0, 1, … , 9, A, B, C, D, E, F} Números en Punto Fijo Números en formato punto fijo tienen una cantidad fija de cifras enteras y fraccionarias, la posición de la coma o punto decimal siempre se ubica en el mismo lugar. La representación externa es la secuencia de dígitos siguiente, donde el signo es el símbolo + o –. Se emplea una coma para separar la parte entera de la fraccionaria: dn dn-1 dn-2 .... d2 d1 d0 , d-1 d-2 …d-(m-1) d-m La representación interna es un numero de largo finito de (n + 1 + m) posiciones que no incluye la coma o el ±. Considerando la siguiente interpretación general para el valor del número: i =n N = ± ∑ d i bi i=−m El rango de la representación aumenta si aumenta n. La precisión del número aumenta si aumenta m. Aritmética Modular Consideremos algunos conceptos sobre aritmética modular. Si el módulo es bn+1. Se tiene: bn+1 mod bn+1 = 0 (bn+1 + b-m) mod bn+1 = b-m En C, el operador mod tiene el símbolo % asociado. Las reglas de asociatividad y distributividad deben ser cuidadosamente aplicadas en una aritmética modular. Ya que, por ejemplo, si ( a + b ) no es representable, entonces ( a + b ) - c puede ser diferente de a + ( b – c ). Ejemplo: a, b, c son representaciones internas de tres bits. a = 110, b = 010, c = 001 (a + b) = 1 000 (overflow), (b – c) = 001 (sin overflow) Aritmética Modular Si se tiene un sistema módulo bn+1, con m cifras fraccionarias y (n + 1) cifras para la parte entera El número bn+1 no es representable. El anterior a éste, es el mayor representable: bn+1- b-m Sea cero la secuencia formada por todos los dígitos iguales a 0 (e.g. 000…000). El número más pequeño siguiente a cero es b-m (e.g. 000…001). El diametralmente opuesto al cero será: (bn+1)/2. Valor que se obtiene dividiendo por dos el máximo. Los valores que estas secuencias numéricas representan dependen del sistema (valores de m, n y b). Ejemplos de Números Dado: dn dn-1 dn-2 .... d2 d1 d0 , d-1 d-2 …d-(m-1) d-m i =n N = ± ∑ d i bi i=−m Para m=0, b=2 y n=2: Con m=0 son valores enteros entre 0 y 7 (000…111) Con m=0, b=10 y n=2: La secuencia asociada al cero es 000, el numero opuesto es 500. El mayor representable es 999 y el menor es 001. Con m=1, b=8 y n=1: La secuencia asociada al cero es 00,0. Su diametralmente opuesta es 32,0; la anterior es 63,875 y la siguiente es 0,125. Aritmética Modular en Hardware Para efectuar operaciones aritméticas, en hardware, se emplea un sumador binario, al cual se le agregan redes combinacionales para ampliar sus capacidades: ya sea para realizar restas, comparaciones, para detectar propiedades del resultado (e.g. overflow). Con la misma unidad aritmética, empleada para enteros, pueden tratarse fraccionarios puros, con y sin signo. Un sumador binario suma los operandos de entrada (provenientes de registros o de una palabra de memoria), ambos de largo L y genera un resultado del mismo largo. De este modo el sumador binario opera con las reglas de la álgebra modular. Un Sumador Modular La suma de dos números A y B, con resultado S, empleando un sumador binario, puede visualizarse como una suma de ángulos, según reloj, en el círculo. Si debido a las dimensiones de los números A y B, el rayo asociado a S sobrepasa los 360 grados, habrá reserva de salida, y S será menor que el menor de los operandos. La posición que ocupa S, es correcta, de acuerdo al álgebra modular, ya que si un número sobrepasa al módulo, se le resta el módulo, dejándolo menor que éste. Números Enteros sin Signo Se emplea m=0, no se usa un bit para el ±. Se asume fija, la posición de la coma decimal: Y se interpreta el valor del número, según: i =n N = ∑ d i bi i =0 Números Fraccionales Se emplea n=0. Una fracción pura, sin signo se representa: Y se puede interpreta como: i =0 N = ∑ d i bi i =− m Una fracción pura, con signo puede representarse: Con ds como bit de signo Números con Signo: Complemento Base Para representar números con signo se suele usar el complemento base. dn dn-1 dn-2 .... d2 d1 d0 , d-1 d-2 …d-(m-1) d-m Los números positivos (dn < b/2) en complemento base se calculan de forma similar a enteros sin signo: Los números negativos (dn >= b/2) se calculan de acuerdo a: El diagrama muestra los valores: Números con Signo: Complemento base Se define la representación interna del complemento base de un número mediante la siguiente expresión, que se evalúa en aritmética módulo bn+1: Para números negativos, en forma interna (en el registro), se escribe la secuencia representada por NCB. dn dn-1 dn-2 .... d2 d1 d0 , d-1 d-2 …d-(m-1) d-m Ejemplo: b=2, m=0, n=2 -1 0 1 2 -2 Para comp. base 2: x + x’ = -1, -3 x’ + 1 = - x Entonces… Para negar x se invierten los bits y se agrega 1. 3 -4 Números con Signo: Comp. Base (cont) El complemento base de un numero es simétrico respecto del eje vertical (excepto del más negativo): En general, el complemento base de un número puede anotarse: N = (b n +1 − N ) mod(b n +1 ) Y puede verificarse que el complemento del complemento de un número es el mismo número (sea positivo o negativo, exceptuando al más negativo que no tiene complemento). La suma de las representaciones internas de un número y su complemento base dan como resultado el módulo. Números con Signo: Sumas y Restas La suma de los ángulos asociados de dos números positivos, que excedan los 180 grados da como resultado un número negativo. La suma de los ángulos asociados, de dos números negativos, que no exceda los (360+180) grados da como resultado un número positivo. La resta entre dos números corresponde a sumar el primer operando con el complemento base del substraendo: A - B = A + complemento base de (B) Números con Signo: Sumas y Restas (cont) En el diagrama el complemento base de B1 es un número más negativo que A, su ángulo en sentido contra reloj es mayor que el complemento base de A; y el número positivo B2 es menor que A, por lo que tiene menor ángulo que el número positivo A. Entonces (A - B2) resulta positivo Sobrepasar al módulo, implica reserva de salida del sumador: A - B2 = A + ( bn+1 – B2) = bn+1 + (A - B2) > bn+1 Números con Signo: Sumas y Restas (cont) Dadas las relaciones anteriores, (A – B1) es negativo. La suma de los ángulos no sobrepasa al módulo; el resultado es negativo y no hay reserva de salida: A – B1 = A + (bn+1 – B1) = bn+1 + (A - B1) < bn+1 Complemento a Base 2 Para enteros, con m=0 y base = 2 se tiene complemento a base dos: Otra interpretación también valida: Complemento a Base 2 Los dígitos correspondientes serian: Para largo de palabra de 32 bits, un número con signo se representa, en forma externa, según: -d31*231 + d30*230 + .... +d1*21+ d0*20 Recordando que: Ejemplo: b=2, n=3,m=0 +5 se representa como: 0101 -5 se representa como: 1011 Dado que 23+1=10000: 1011 = 10000 - 0101 Complemento a 1 Para enteros, con base dos, se tiene la representación complemento a uno. Con n=2, +3 se representa según: 011 -3 se representa según: 100 Ya que: 2n+1 –1 = 111, al restar del positivo 011, resulta 100. Se puede generalizar esta operación, y plantear que para obtener el complemento uno de un número basta efectuar la negación bit a bit, o cambiar los unos por ceros, y los ceros por unos. Notar: Nc2 = Nc1 + 1 Números Polarizados Se emplea en el exponente de un número en punto flotante. Se desea tener un rango simétrico para los números. Si nos basamos en la representación complemento base deseamos que el número más negativo (que tenga complemento base) sea representado por una secuencia de puros ceros. Para esto a la representación en complemento base se le suma una polarización. n +1 b i = ∑ d i b − − 1 i =0 2 n N polarizado Números Polarizados (cont) Los valores asociados a las secuencias de dígitos, que representan números con signo, en enteros polarizados en representación interna, se ilustran en los siguientes diagramas. Es similar a complemento base, pero se le suma una polarización de (bn+1)/2 -1, lo cual produce que el máximo número negativo se representa ahora como una secuencia de puros 0s. Números Signo Magnitud Números de tipo signo magnitud tienen dos ceros y un rango simétrico. Ejemplo: m = 0, n = 3, +3 se representa según: 011 -3 se representa según: 111 Conversión entre Base b y Base bk Si b = 2, con k = 3 se tiene número octal, si k = 4 se tiene hexadecimal. Sean dos secuencias de dígitos que representan números equivalentes en base b y base bk. (...a3 a2 a1 a0, a-1 a-2 a-3...)b = ( ...A3 A2 A1 A0, A-1 A-2 A-3...)b^k Si los números son equivalentes se cumple que tienen iguales valores decimales, es decir: Σa j b j = ΣA j b kj Agrupando k cifras del sistema en base b, puede expresarse la primera suma (factorizando b kj): Σa j b j = Σ ( akj+k –1 bk-1 +.....+ a kj b0) bkj Conversión entre Base b y Base bk (cont) Entonces se cumple que cualquier dígito del sistema de base b k, puede representarse según la secuencia de k dígitos en base b: Aj = ( a kj +k –1 .....a kj )b Lo que resta es convertir el número en base b, a base bk. Conversión entre Base b y Base bk (cont) Ejemplo: Dado un número binario convertir a hexadecimal. Número binario es: 101000102 = 1*27 + 0*26 + 1*25 + 0*24 + 0*23 + 0*22 + 1*21 +0*20 Se forman grupos de 4 cifras: = (1*23 +0*22 + 1*21 + 0*20)24*1 + (0*23 + 0*232 +1*21 +0*20)24*0 Se representan los grupos entre paréntesis por número binarios: = (1010)224*1 + (0010)224*0 Los números binarios se expresan en hexadecimal: = (A16) 24*1 + (216) 24*0 = (A16)161 + (216) 160 = A216 Conversión entre Base b y Base bk (cont) Entonces para convertir un número en base b a base bk, basta leer en hexadecimal cada grupo de cuatro cifras binarias. La conversión de hexadecimal a binario consiste en reemplazar cada cifra hexadecimal por el grupo equivalente de cuatro cifras binarias. Esto permite leer o escribir de manera compacta una larga secuencia binaria. Las conversiones de binario a octal, y viceversa se realizan de manera similar. Números Decimales a Binarios La representación externa al computador son cifras decimales pero la representación interna es binaria. Se desea desarrollar un algoritmo para efectuar la conversión decimal a binario, pero con las operaciones en binario, para que pueda ser desarrollado por un procesador. Sean dos secuencias de dígitos que representan números equivalentes en base 2 y base 10. (...a3 a2 a1 a0, a-1 a-2 a-3...)2 = ( ...A3 A2 A1 A0, A-1 A-2 A-3...)10 Si los números son equivalentes se cumple que tienen iguales valores decimales, es decir: Σaj2j = ΣAj10j Números Decimales a Binarios (cont) Ejemplo: Convertir 98 decimal a binario. 98 = 10012*10102 + 10002 = 10110102 + 10002 = 11000102 Para cinco cifras decimales se tendrá el siguiente equivalente binario: A[4]*(1010)4 + A[3]*(1010)3 + A[2]*(1010)2 + A[1]*(1010)1 + A[0] La suma anterior puede escribirse del modo siguiente: (((A[4]*(1010) + A[3])*(1010) + A[2])*(1010) + A[1])*(1010) + A[0] El algoritmo de conversión, para N cifras decimales, puede plantearse: for (j=N-1, num=A[j]; j>0; j--) num = num*1010 +A[j-1]; Números Decimales a Decimales ASCII Los números decimales pueden ser una secuencia de caracteres ASCII, donde cada número decimal se representa por un byte. En ASCII los cuatro bits menos significativos son la representación binaria del dígito decimal: ‘0’=0x30 = 00110000 ‘1’=0x31 = 00110001 ,..., ’9’=0x39 = 00111001 Si es una cifra decimal, su equivalente ASCII está entre 0x30 y 0x39. Si al byte que representa la cifra decimal se le resta 0x30, se obtiene la secuencia binaria que lo representa. Si al char que representa la cifra decimal se le resta ‘0’, el char asociado al dígito decimal 0, se obtiene la secuencia binaria del dígito decimal. Números en Punto Flotante Se denominan así a las representaciones internas al procesador que modelan a los números reales. En forma externa, se representan como números con coma (o punto) (3,1415926), o bien en notación científica 0.12 * 10-5. Se dice que el número está normalizado si el dígito a la izquierda no es cero; en el ejemplo anterior: 1.2 * 10-6 . En el caso de computadores, se emplean números en sistema binario con un número finito de dígitos. Existe un compromiso entre los bits dedicados al exponente y los que representan la mantisa (bits significativos del número). El compromiso es entre el rango de representación y la exactitud de la representación. Norma IEEE 754 Estudiaremos números de punto flotante de acuerdo a la norma IEEE 754. En forma externa, un número flotante normalizado, se interpreta: (-1)S*1.M2*2Ee La mantisa siempre comienza en 1, y M representa un fraccionario puro sin signo. Ee2 es el exponente. La mantisa y el exponente se almacenan en formato binario en la computadora. Norma IEEE 754 Flotante de precisión simple (en C es el tipo float). En forma interna, ocupando 32 bits, se tiene 1 bit signo, 8 bits de exponente y 23 bits de mantissa. Flotante de doble (en C es el tipo double). En forma interna, ocupando 64 bits, se tiene 1 bit signo, 11 bits de exponente, 52 bits de mantissa. Norma IEEE 754 (cont) El exponente Ei, en forma interna, se representa como número polarizado con signo (Ni=Ne+Pol) Para 8 bits: -127 <= Ee <= +127 con Ei = Ee + 127 Para 11 bits: -1023 <= Ee <= +1023 con Ei = Ee + 1023 La norma IEEE 754 contempla: números normales, subnormales, representaciones para el cero y el infinito, y para números inválidos (NaN, not a number). Norma IEEE 754 (cont) Números sub-normales: Con –127 = Ee y M2 !=0 Ei=0 se tiene: N = (-1)S*0.M2*2-126 Cero: Con –127 = Ee y M2 ==0 Ei=0 se tiene: N = (-1) S*0.0 Números normales: Con –127 < Ee <=127 se tiene: N = (-1)S*1.M2*2Ee Infinito: Con Ee =-128 y M2 ==0 Ei= -1 se tiene: N = (-1) S * ∞ Número inválido: Con Ee =-128 y M2 !=0 Ei= -1 se tiene: N = NaN Rango de Representación IEEE 754 Si el número a representar es menor que el menor representable, se dice que existe underflow (vaciamiento). La representación interna para el menor positivo es: 0x00000001 S = 0, Ei = 0, M = 000000000000000000000012 Como M es diferente de cero y Ei es cero, se tendrá un número sub-normal, que se interpreta según: N = (-1)S*0.M2*2-126 = + 0.000000000000000000000012 *2-126 = 2-126-23 = 1.401298464324817e-45 Entonces se tiene vaciamiento para |N| < (-1)S*2-149 ≈ 1,40130 10-45 Rango de Representación IEEE 754 (cont) Si el número a representar es mayor que el mayor representable se dice que existe overflow (rebalse). El positivo mayor representable tiene: cero en el signo, el mayor exponente positivo (+127), y la mayor mantisa (con puros unos en los bits dedicados a la mantisa): 0x7f7fffff N = (-1)0*1.M2*2127 = + 1.111111111111111111111112 *2127 = 3.4028234663852886e+38 Rebalse para |N| > (-1)S*(2- 2-23)*2127 ≈ 3,402823 1038 Para obtener las cifras decimales: 2127 = 10x , que implica: x = 127 log 2 = 127 * 0,30103 ≈ 38. Nótese que no pueden representarse números muy pequeños, ni números muy grandes. Rango de Representación IEEE 754 (cont) La representación interna de +0.0, por convenio es una secuencia de puros ceros. En doble precisión, con 11 bits, en decimal el exponente mayor es aproximadamente 308; el menor –308. Constantes y definiciones en C Se incluyen algunas definiciones de constantes relacionadas con números en punto flotante que se encuentran en el archivo float.h de la biblioteca de C. #define FLT_RADIX 2 #define FLT_ROUNDS 1 #define FLT_GUARD 1 #define FLT_NORMALIZE 1 #define DBL_DIG 15 /*dígitos decimales de un double */ #define FLT_DIG 6 /*dígitos decimales de un float */ #define DBL_MANT_DIG 53 /* bits de la mantisa de un double */ #define FLT_MANT_DIG 24 /* bits de la mantisa de un double */ ...etc...