Download Tema 4: Representación de números en el computador.
Document related concepts
Transcript
Tema 4: Representación de números en el computador. Representación de números en el computador, aritmética del computador y errores de redondeo. Uso del comando whos. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación de punto flotante bajo el estándar IEEE El Instituto de Ingenieros Eléctricos y Electrónicos (IEEE por sus siglas en inglés) publicó en 1985 el estándar IEEE 754 que rige la forma de almacenar y operar los números de punto flotante en el computador. En la actualidad, la mayoría de los computadores personales de escritorio y portátiles poseen arquitectura de 32 bits, lo que significa que los números de punto flotante, en precisión simple, son almacenados usando 32 dígitos binarios siguiendo el mencionado estándar. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Terminología asociada con la representación de números en el computador bit Hace referencia a un dígito binario (0 ó 1) y proviene de la contracción de las palabras inglesas "binary digit". Es la unidad de almacenamiento en el computador y está asociada a una celda electrónica. byte Es un conjunto de 8 bits. Así, en MATLAB, un número ocupa 8 bytes, lo cual equivale a 64 bits. Esto se debe a que MATLAB trabaja automáticamente en precisión doble. palabra En el computador, una palabra es un conjunto de bits o celdas electrónicas, que representan un número en base 2. En la mayoría de las arquitecturas computacionales actuales, las palabras del computador ocupan 32 bits (existen, sin embargo, arquitecturas de 64 bits para PC en la actualidad). precisión simple En el estándar IEEE 754, se refiere al almacenamiento de un número usando de 32 bits, siguiendo dicho estándar . precisión doble En el estándar IEEE 754, se refiere al almacenamiento de un número usando 64 bits, siguiendo dicho estándar . número de máquina Se refiere a cualquier número que se obtenga a partir de la representación de punto flotante normalizada o desnormalizada bajo el estándar IEEE 754. Se incluye al cero y a los números enteros representables. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación en base 10 de un número 0.10110 = 1 ⋅10 −1 + 0 ⋅10 − 2 + 1 ⋅10 −3 = 1 1 + = 0.101 10 1000 Representación en base 2 de un número 0.1012 = 1 ⋅ 2 −1 + 0 ⋅ 2 − 2 + 1 ⋅ 2 −3 = 1 1 + = 0.62510 2 8 11011.012 = 1 ⋅ 2 4 + 1⋅ 23 + 0 ⋅ 2 2 + 1⋅ 21 + 1⋅ 20 + 0 ⋅ 2 −1 + 1 ⋅ 2 −2 1 = 16 + 8 + 2 + 1 + = 27.2510 4 En general x = (an an −1 L a1a0 . a−1a− 2 L a− m ) 2 = an ⋅ 2 n + an −1 ⋅ 2 n −1 + L + a1 ⋅ 21 + a0 ⋅ 2 0 + a−1 ⋅ 2 −1 + a− 2 ⋅ 2 − 2 + L + a− m ⋅ 2 − m Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación en base 2 de un número entero x = (an an −1 L a1a0 ) 2 = an ⋅ 2 n + an −1 ⋅ 2 n −1 + L + a1 ⋅ 21 + a0 ⋅ 2 0 = 2(an ⋅ 2 n −1 + an −1 ⋅ 2 n − 2 + L + a1 ) + a0 Luego a0 es el resto de dividir x entre 2. n o c x = 2 ⋅ x1 + r0 y x1 = an ⋅ 2 n −1 + an −1 ⋅ 2 n − 2 + L + a1 r0 = a0 Para hallar el siguiente dígito a1, aplicamos el mismo procedimiento a x1 n o c x1 = an ⋅ 2 n −1 + an −1 ⋅ 2 n − 2 + L + a1 = 2 ⋅ x2 + r1 y x2 = an ⋅ 2 n − 2 + an −1 ⋅ 2 n −3 + L + a2 r1 = a2 Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación en base 2 Ejemplo1: x = 25 ⇒ x = 2 ⋅12 + 1 ⇒ a0 = 1 x1 = 12 ⇒ x1 = 2 ⋅ 6 + 0 ⇒ a1 = 0 x2 = 6 ⇒ x2 = 2 ⋅ 3 + 0 ⇒ a2 = 0 x3 = 3 x3 = 2 ⋅1 + 1 ⇒ a3 = 1 x4 = 1 ⇒ x4 = 2 ⋅ 0 + 1 ⇒ a4 = 1 x5 = 0 a z i l a n i f ⇒ 25 2 1 12 2 0 6 2 0 3 2 1 1 2 1 0 Los dígitos se van obteniendo desde el menos (a0) significativo hasta el más significativo (an), por lo tanto debemos escribir la representación del número x en base 2 tomando los restos sucesivos en el orden indicado por la flecha de la gráfica. por lo tanto (25)10 = (11001)2 Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación en base 2 de la parte fraccionaria de un número x = (.a−1a− 2 L a− m ) 2 = a−1 ⋅ 2 −1 + a− 2 ⋅ 2 −2 + L + a− m ⋅ 2 − m 1 (a−1 + a− 2 ⋅ 2 −1 + L + a− m ⋅ 2 − m +1 ) 2 2 x = a−1 + a− 2 ⋅ 2 −1 + L + a− m ⋅ 2 − m +1 luego así, a-1 es la parte entera de 2x, y repetimos el mismo proceso para calcular el siguiente dígito Ejemplo2: x = 0.8125 2 x = 1.625 ⇒ x1 = 0.625 ⇒ 2 x1 = 1.25 ⇒ ⇒ 2 x2 = 0.50 x3 = 0.50 ⇒ 2 x 2 = 1 .0 a z i l a n i f x2 = 0.25 x4 = 0.0 ⇒ por lo tanto ⇒ ⇒ a−1 = 1 a− 2 = 1 a−3 = 0 a− 4 = 1 (0.8125)10 = (0.1101)2 Prof. Saúl. Buitrago y Oswaldo Jiménez tomando los dígitos en el orden indicado por la flecha de la gráfica 4. Representación de números en el computador Ejemplo: ´Para el número 42,375 se procede como sigue. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación en base 16 En muchas ocasiones, los usuarios de computadora avanzados, tal como los programadores de Assembler o lenguaje Ensamblador, requieren conocer directamente el contenido binario de una o más palabras del computador. Dado lo largo de la secuencia de 32 bits o de 64 bits, es muy común que los sistemas operativos muestren el contenido binario de las palabras de computadora en base 16 en lugar de mostrarlo en base 2. Esta convención se refiere sólo al despliegue de la información, no al almacenamiento propiamente dicho. decimal binario base 16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0 1 2 3 4 5 6 7 8 9 A B C D El número binario se divide en bloques de 4 dígitos (la parte entera de derecha a izquierda y la parte decimal de izquierda a derecha) desde el punto decimal (361.7891)10 = (0001 | 0110 | 1001.1100 | 1010) 2 = (169.CA)16 1 6 9 C Prof. Saúl. Buitrago y Oswaldo Jiménez A E F 4. Representación de números en el computador Representación en base 16 Justificación del cálculo (101101001 .110010 ) 2 = (0001 | 0110 | 1001.1100 | 1010) 2 = (169.CA)16 x = (. b−1b− 2b−3b− 4b−5b−6b−7b−8 L) 2 = b−1 ⋅ 2 −1 + b− 2 ⋅ 2 − 2 + b−3 ⋅ 2 −3 + b− 4 ⋅ 2 − 4 + b−5 ⋅ 2 −5 + b−6 ⋅ 2 −6 + b−7 ⋅ 2 −7 + b−8 ⋅ 2 −8 + L = (8b−1 + 4b− 2 + 2b−3 + b− 4 ) ⋅ 2 − 4 + (8b−5 + 4b−6 + 2b−7 + b−8 ) ⋅ 2 −8 + L = (8b−1 + 4b− 2 + 2b−3 + b− 4 ) ⋅16 −1 + (8b−5 + 4b−6 + 2b−7 + b−8 ) ⋅16 − 2 + L notar que los b-i, i=1,2,3,…, son los números 0 o 1, y la operación entre paréntesis produce dígitos entre 0 y 15, los cuales corresponden con los símbolos entre 0 y 9 o A y F. Observación. El proceso de conversión entre números de base 2 y base 8 se lleva a cabo en forma similar, en este caso se usan bloques de 3 dígitos. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Representación en base β Sea β la base usada en el computador, β = 2,8,16. El sistema más apropiado para representar números en un computador electrónico es el binario (base 2). Sea x un número real, con x distinto de cero y normalizado x = σ ( d 0 . d1 d 2 L d t ) β β (e)β donde σ representa el signo de x (d 0 .d1d 2 L d t ) β la mantisa en base β (e) β el exponente en base β d 0 es un número entero entre 1 y β − 1 Ejemplo de normalización de un número en base 2: Sea el número x = (49.8125)10 5 en base 2 x = (110001 .1101)2 = (1.100011101 )2 2 (101)2 5 posiciones Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador El estándar IEEE 754 para la representación de números de punto flotante en precisión simple supone el uso de palabras de 32 bits. Así, un número x puede ser representado usando: • 1 bit para el signo • 8 bits para el exponente (la característica) • 23 bits para la parte fraccionaria (la mantisa) El bit b1 representa el signo del número, valiendo 0 si el número es positivo y 1 si el número es negativo. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Los siguientes 8 bits comprendidos entre el b2 y el b9 almacenan el exponente e. El valor e de la representación no se almacena directamente, lo que se almacena es el resultado de sumarle a e un valor fijo llamado sesgo. Los 8 dígitos para el exponente en base 2, representan un intervalo que va del 0 al 28-1 = 255 1 1 1 1 1 1 1 1 = 1 ⋅ 2 7 + 1 ⋅ 2 6 + L + 1 ⋅ 21 + 1 ⋅ 2 0 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 A fin de obtener un rango de exponentes positivos y negativos alrededor de cero, se resta 127 del exponente, de manera que el intervalo para el exponente es en realidad [-127, 128]. El 127 es justamente el sesgo mencionado. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador En base 2, se tiene que la parte entera de la mantisa, esto es d0, siempre será igual a 1. Por lo tanto no es necesario almacenar ese valor. Los dígitos de la mantisa que sí se almacenan son d1, d2, …, dt, es decir los dígitos de la parte fraccionaria de la mantisa, se denotaran como m. Si t = 23, es claro que se deben almacenar 23 dígitos, que es justamente la cantidad de bits reservados para la mantisa en el estándar. Luego, los dígitos d1, d2, …, dt se almacenan en los bits b10, b11, …, b32 respectivamente. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador 5 en base 2 Retomando el ejemplo x = 49.8125 x = (110001.1101)2 = (1.100011101 )2 2 (101)2 El número normalizado x = (1.100011101 )2 2 (101)2 se representa como 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 signo exponente 1 bit 8 bits mantisa 23 bits el exponente e = (5 + 127 (sesgo))2 : e = 5 + 127 = 132 = (10000100 )2 el signo s se representa como 0 si es positivo y 1 si es negativo, en este caso s=0 la parte fraccionaria de la mantisa es (100011101)2 de donde m = (0.100011101)2 El uso de este sistema proporciona un número en punto flotante de la forma (−1)s 2e −127 (1 + m ) Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador El número de máquina menor que le sigue al número 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 49. 8125 es el número 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 = 49. 81249618530273 y el siguiente número de máquina mayor es 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 = 49. 81250381469727 Esto significa que nuestro número de máquina original representa no sólo a 49.8125 sino también a los números que están en el intervalo entre corchetes (línea azul). [ 49. 81249618530273 49.8125 float2dec.m Prof. Saúl. Buitrago y Oswaldo Jiménez ] 49. 81250381469727 4. Representación de números en el computador Ejemplo: Representación punto flotante de algunos números en base decimal 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 1.0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 2.0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = -6.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = +0 El conjunto de números de máquina posee un conjunto de características importantes, a saber: • Es un conjunto finito y discreto. • Es simétrico respecto al cero (existe la misma cantidad de números de máquina negativos y positivos). • Los números de máquina se aglomeran a medida que se acercan al cero. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador El estándar IEEE 754 para la representación de los números de punto flotante en precisión doble supone el uso de palabras de 64 bits y se basa en la notación científica normalizada. Esquematicemos la palabra de 64 bits como se muestra a continuación El bit b1 representa el signo del número, valiendo 0 si el número es positivo y valiendo 1 si el número es negativo; los siguientes 11 bits comprendidos entre b2 y b12 almacenan el exponente y, finalmente, los últimos 52 bits de la palabra sirven para almacenar la mantisa. Dado que se está considerando la números normalizados en base 2, se tiene que la parte entera de la mantisa, esto es d0, siempre será igual a 1. El sesgo a ser usado para el exponente es 1023. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Se define el épsilon de la máquina como la distancia entre 1 y el siguiente número representable mayor que 1. De acuerdo al estándar IEEE 754, el épsilon de la máquina en precisión simple es 2-23 ≈ 1.192092895507813e-007, mientras que en precisión doble es 2-52 ≈ 2.220446049250313e-016. En MATLAB estas cantidades son proporcionadas por la función eps, invocada con el parámetro 'single' en el primer caso y sin parámetros en el segundo. En general, si en la representación de punto flotante se usan n bits para almacenar la mantisa, entonces el épsilon de la máquina es 2-n. Ejemplo: Representación punto flotante de eps en precisión simple (23 bits para almacenar la mantisa) 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador El épsilon de la máquina posee una caracterización que suele ser útil para calcularlo sin conocer el estándar de almacenamiento del computador. Dicha caracterización es la siguiente: "El épsilon de la máquina es el número más pequeño de la forma 2-k (k entero positivo) tal que 1 + 2-k ≠ 1". Quiere decir que en el computador alguna potencia negativa de 2 no le agrega nada al número 1, es decir, debe existir un entero positivo m tal que 1+2-m = 1. ¿Cuál es el valor más pequeño de m en precisión simple y doble? Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Existe un número de máquina más grande: en precisión simple es 127 2 23 × (1.111K11) 2 = 2 127 × (1 + ∑ 2 − k ) ≈ 3.402823466385289 e + 038 k =1 23 unos después del punto en precisión doble es 1023 2 × (1.111K11) 2 = 2 1023 52 × (1 + ∑ 2 − k ) ≈ 1.797693134862316 e + 308 52 unos después del punto k =1 Estos valores son suministrados por la función realmax de MATLAB, pasándole el argumento 'single' y ningún argumento para precisión doble, esto es, realmax('single') en el primer caso y realmax en el segundo caso. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Existe un número de máquina positivo normalizado más pequeño: en precisión simple es 2 −126 × (1.000 K 00) 2 = 2 −126 × 1 ≈ 1.1754943508 22288 e + 038 23 ceros después del punto en precisión doble es 2 −1022 × (1.000 K 00) 2 = 2 −1022 × 1 ≈ 2.2250738585 07201 e − 308 52 ceros después del punto Estos valores son suministrados por la función realmin de MATLAB, pasándole el argumento 'single' y ningún argumento para precisión doble, esto es, realmin('single') en el primer caso y realmin en el segundo caso. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Errores de redondeo y aritmética del computador Redondeo. Es el proceso de aproximar un número no de máquina por un número de máquina. Más específicamente, si el número de máquina que se elige para la aproximación es aquel que está más cerca del número dado, se habla de redondeo correcto. Error de redondeo. Es el error que se comete al aproximar un número que no es de máquina por un número de máquina. Resulta que el error de redondeo (relativo) está acotado por el épsilon de la máquina. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Si p* es una aproximación de p, definimos dos tipos de errores: El error absoluto, que viene dado por EA =| p * − p | El error relativo, que está dado por ER = siempre y cuando p sea distinto de cero. | p * −p| | p| Ejemplo: p = 0.3000 ×101 p = 0.3000 ×10 −3 p* = 0.3100 ×101 p* = 0.3100 ×10 −3 EA = 0.1 EA = 0.1×10 − 4 ER = 0.3333 ×10−1 ER = 0.3333 ×10−1 Observaciones: • el error relativo en ambos casos es el mismo, mientras los errores absolutos son diferentes • como medida de precisión el error absoluto puede ser engañoso, en cambio el error relativo puede ser más significativo Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador El ejemplo que se muestra a continuación ilustra como los errores de redondeo podrían de alguna manera inutilizar el resultado de una operación. Por conveniencia se trabajará en base 10 con una aritmética de tres dígitos significativos para el almacenamiento. Ejemplo: Consideremos la siguiente suma: 0.99 + 0.0044 + 0.0042. Con aritmética exacta (los números se pueden almacenar totalmente, no hay errores de redondeo), el resultado es 0.9986. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Ejemplo (cont.): Sin embargo, si usamos una aritmética de tres dígitos significativos, y las operaciones se realizan siguiendo el orden de izquierda a derecha, encontramos que (0.99+0.0044)+0.0042 = 0.994+0.0042 = 0.998. Por otra parte, si operamos primero los dos últimos números, y después sumamos el primero, tenemos que: 0.99+(0.0044+0.0042) = 0.99+0.0086 = 0.999, lo cual demuestra el efecto del error por redondeo en un caso tan simple como éste. (¿Por qué sucede esto?). Desde el punto de vista numérico es importante el orden en que sumamos. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Operaciones que producen errores en MATLAB: • La suma de muchos números siempre genera errores de redondeo, lo importante es que estos errores no inutilicen el resultado. • La suma de números de magnitudes distintas. • la sustracción de números casi iguales. Ejemplo: 10^20 - (10^20 +1) es igual a 0 en MATLAB (10^20 - 10^20) -1 es igual a -1 en MATLAB aunque matemáticamente 10^20 - (10^20 +1) = (10^20 - 10^20) -1 = -1 Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Ejemplo: Sabemos que 1.0 – 5 * 0.2 = 0, pero si lo calculamos en MATLAB de la siguiente manera >> 1 - 0.2 - 0.2 - 0.2 - 0.2 - 0.2 ans = 5.5511e-017 Este resultado es bastante pequeño, pero no es cero. La razón de esto es que el numero binario correspondiente a 0.2 es 0.001100110011001100 … Esta representación requiere un número infinito de dígitos. La consecuencia de esto es que el computador trabaja con una aproximación de 0.2, y restar a 1 una aproximación de 0.2 cinco veces no conduce a cero. Prof. Saúl. Buitrago y Oswaldo Jiménez 4. Representación de números en el computador Comando “whos” Lista todas las variables en el espacio de trabajo (workspace), en conjunto con la información acerca de su tamaño, número de bytes reservados para almacenarla, tipo/clase, etc. Ejemplo: para los comandos siguientes >> A = [ 1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16 ]; >> B = [5 6 7 8] >> b = 1/0; >> c = pi; >> cc = 1 - 2i; >> ff = 1 + 1 > 2; >> ~(1 + (6.8 + 5 < 45) * 3); >> whos Name A B ans b c cc ff Size 4x4 1x4 1x1 1x1 1x1 1x1 1x1 Bytes 128 32 1 8 8 16 1 Prof. Saúl. Buitrago y Oswaldo Jiménez Class double double logical double double double logical Attributes complex Colocar ejemplo 0.1 base 10 y base 2, usando representación de 64 bits ¿Qué sucede aquí? >> 0.5-0.1-0.1-0.1-0.1-0.1 ans = 2.7756e-017 >> 0.5-0.1*5 ans = 0 Prof. Saúl. Buitrago y Oswaldo Jiménez