Representación en Punto Flotante Minaya Villasana Abril-Julio, 2004 1 Representación en base 2 Las computadoras tienen dos formas de representar números: enteros (solo usado para enteros) y punto flotante (números reales). Nosotros estamos interesados en aritmética de punto flotante. Punto flotante está muy relacionado con la notación cientı́fica. Un número real cualquiera x ∈ R, se puede descomponer como una suma (infinita) en base 10. Por ejemplo: 49.8125 = 4 · 101 + 9 · 100 + 8 · 10−1 + 1 · 10−2 + 2 · 10−3 + 5 · 10−4 + 0 · 10−5 + · · · Cuando hablamos de la representación en base diez, tenemos a disposición un alfabeto de 10 para representar los números: {0, 1, 2, 3, 4, 5, 6, 7, 8 y 9}. Las computadoras por lo general no representas los números en base decimal sino en binario (base 2), donde el alfabeto es {0 y 1}. En el pasado existieron computadoras que tenı́an una representación octal (base 8) o hexagesimal (base 16). Una representación tı́pica en base 2 es (11011.01)2 el cual en base decimal corresponde al número 27.25. (11011.01)2 1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 0 · 2−2 1 = 16 + 8 + 2 + 1 + 4 = 27.25 = Notar que el principio es el mismo que en base 10; cada dı́gito en la representación acompaña a una potencia de la base. Los dı́gitos a izquierda del punto binario acompañan a potencias positivas de 2 y los que están a la derecha del punto acompañan a potencias negativas de 2. Ejemplo 1.1. Pasar x = 49 a binario. 1 En este caso x es un número entero y por lo tanto tiene una representación binaria de la forma x = (an an−1 an−2 · · · a1 a0 )2 = an · 2n + an−1 · 2n−1 + an−2 · 2n−2 + · · · + a1 · 21 + a0 · 20 = 2(an · 2n−1 + an−1 · 2n−2 + an−2 · 2n−3 + · · · + a1 ) + a0 luego x = 2 · x1 + r, con x1 = an · 2n−1 + an−1 · 2n−2 + an−2 · 2n−3 + · · · + a1 y r = a0 , de aqui que a0 es el resto de dividir x entre 2. Para hallar el siguiente dı́gito, a1 , realizamos lo mismo, pero ahora aplicado a x1 . x1 = 2(an · 2n−2 + an−1 · 2n−3 + an−2 · 2n−4 + · · · + a2 ) + a1 . En nuestro caso particular, x = 49 = 2 · 24 + 1 ⇒ a0 = 1 x1 = 24 = 2 · 12 + 0 ⇒ a1 = 0 x2 = 12 = 2 · 6 + 0 ⇒ a2 = 0 x3 = 6 = 2 · 3 + 0 ⇒ a3 = 0 x4 = 3 = 2 · 1 + 1 ⇒ a4 = 1 x5 = 1 = 2 · 0 + 1 ⇒ a5 = 1 x6 = 0 = 0 Por lo tanto 49 = (110001)2 . Ejemplo 1.2. Pasar x = 0.8125 a binario. A diferencia del ejemplo anterior x es un número decimal y por lo tanto tiene una representación binaria de la forma x = = = (.a−1 a−2 a−3 · · · )2 a−1 · 2−1 + a−2 · 2−2 + a−3 · 2−3 + · · · 1 (a−1 · +a−2 · 2−1 + a−3 · 2−2 + · · · ) 2 luego 2x = a−1 · +a−2 · 2−1 + a−3 · 2−2 + · · · , de aqui que a−1 es el la parte entera de 2x. Para hallar el siguiente dı́gito, a−2 , realizamos lo mismo, pero ahora aplicado a x1 . x1 = a−2 · 2−1 + a−3 · 2−2 + · · · 2 En nuestro caso particular, x = 0.8125 ⇒ 2x = 1.625 ⇒ a−1 = 1 x1 = 0.625 ⇒ 2x1 = 1.25 ⇒ a−2 = 1 x2 = 0.25 ⇒ 2x2 = 0.5 ⇒ a−3 = 0 x3 = 0.5 ⇒ 2x3 = 1 ⇒ a−4 = 1 Por lo tanto 0.815 = (.1101)2 . Ejemplo 1.3. Pasar x = 49.8125 a binario. De los ejemplos 1.2 y 1.1, podemos decir que 49.8125 = (110001.1101)2 1.1 Conversión de sistema Octal También podemos hacer conversiones de base decimal a base ocho y base dos (10 ↔ 8 ↔ 2). Veamos el ejemplo de conversión de base octal a base binaria y viceversa. Para hacer esta conversión notamos que grupos de tres dı́gitos binarios pueden ser traducidos directamente a base ocho según la siguiente tabla: Binario Octal 000 001 010 011 100 101 110 111 0 1 2 3 4 5 6 7 ası́ que el número (101 101 001 .110 010 100)2 = (551.624)8 . La justificación se basa en el cálculo siguiente: x = (0.b1 b2 b3 . . . b6 . . .)2 = b1 2−1 + b2 2−2 + b3 2−3 + b4 2−4 + b5 2−5 + b6 2−6 + · · · = (4b1 + 2b2 + b3 )8−1 + (4b4 + 2b5 + b6 )8−2 + · · · Los números en () en la última ecuación solamente producen los dı́gitos 0,1, ..., 7 puesto que cada bi solamente puede tomar valores 0 o 1. por lo tanto esta debe ser la representación en el sistema octal. En el otro sentido hacemos la traducción según la tabla anterior, de modo que (5362.74)8 = (101011110010.111100)2 . 3 2 Representación en la computadora Sea β la base usada en el computador para la representación (β puede ser 2, 8 o 16). Para x ∈ R, x 6= 0, x = σ · (.a1 a2 · · · at )β · β E donde σ representa el signo (σ = 1 es un número negativo y σ = 0 es un número positivo). La mantisa (.a1 a2 · · · at )β y el exponente E. En el ejemplo 1.3, vimos que 49.8125 = (110001.1101)2 . Para representar el número primero lo normalizamos. La normalización de (110001.1101)2 resulta en (1.100011101)2 · 25 . Notar que el dı́gito 1 (a izquierda) siempre estará presente en la normalización (porqué?). Por lo tanto este dı́gito muchas veces se omite en las representaciones para permitir aumentar la cantidad de información almacenada. Siguiendo el estandar de la IEEE (32 bits), un número puede ser representado de la siguiente manera: un bit para el signo, ocho bits para el exponente y 23 bits para la mantisa. Si la mantisa tiene menos de 23 dı́gitos entonces rellenamos los bits restantes con 0. El exponente se guarda sumándole el sesgo correspondiente al número de bits de la representación (para 32 bits el sesgo es 127). la razón es que el exponente es un número con signo entre -126 y 127, el sesgo se suma al exponente real para almacenar un número positivo que represente al exponente. En nuestro ejemplo el nuevo exponente a almacenar es 5 + 127 = 132 = (10000100)2 . [0][010000100][1000111010000000 . . . 0] Nota: una máquina de 64 bits (precisión doble) utiliza 1 bit para el signo, 11 bits para el exponente y 52 para la mantisa. Al representar un número real (posiblemente con una representación binaria infinita) en la computadora lo hacemos con número finito de bits. Mas aún, en la computadora representamos un número infinito de número reales con un número finito de bits. Sea f l(x) la representación en punto flotante de x ∈ R. Supongamos que x ∈ R y x ∈ [f l(x1 ), f l(x2 )]. Existen dos formas de representar a x. 1. Truncando: Ignora todos los bits mas allá del t-ésimo dı́gito, si t es el número de bits disponibles para la mantisa. 2. Redondeando: Seleccionar el punto flotante más cercano. f l(x ) : x − f l(x ) ≤ f l(x ) − x 1 1 2 f l(x) = f l(x ) : x − f l(x ) > f l(x ) − x 2 1 2 4 Mientras x sea más grande, fl(x1 )−f l(x2 )incrementa, dondex1 y x2 , por lo tanto el error de truncamiento aumenta. 3 Errores Existen dos formas de medir el error: Definición 3.1. Error Absoluto = |x − f l(x)|. Definición 3.2. Error Relativo = f rac|x − f l(x)||x|. La diferencia entre los dos errores es que el error absoluto nos ofrece información sobre la concordancia de puestos decimales mientras que el relativo nos dice cual es el acuerdo de los valores en cifras significativas. Consideremos la siguiente tabla de valores 4 Ejercicios 1. cual es el mayor exponente que se puede representar en un computador binario de 32 bits? 2. cual es el menor exponente que se puede representar en un computador binario de 32 bits? 3. cual es el sesgo para un máquina de 64 bits? 5