Taller de Informática I Dpto. Computación – F.C.E. y N. - UBA 2010 Detalles de Matlab MATLAB utiliza la aritmética del punto flotante, la cual involucra un conjunto finito de números con precisión finita. Esta limitación conlleva dos dificultades: los números representados no pueden ser arbitrariamente grandes (en valor absoluto). debe haber “agujeros” entre ellos. Esto conduce a los fenómenos de roundoff, underflow, y overflow. Por lo general, es posible utilizar MATLAB eficazmente sin preocuparse de estos detalles. Hace 20 años, la situación era más complicada de lo que es ahora. Cada computadora tenía su propio sistema de números en punto flotante (algunos eran binario, otras decimal). Había incluso una computadora rusa que utilizó aritmética ternaria. Además, entre los binarios algunas utilizaron aritmética de base 2, otras, octal o hexadecimal. Y cada una tenía una precisión diferente. En 1985 la IEEE Standards Board y la American National Standards Institute decidieron adoptar para la aritmética binaria de punto flotante lo que se conoce como ANSI/IEEE 754-1985. Todas las computadoras diseñadas a partir de 1985 usan la aritmética IEEE de punto flotante. Esto no significa que arrojen los mismos resultados, porque hay cierta flexibilidad en la norma ANSI/IEEE. Significa que el modelo es independiente de la computadora que se utilice. MATLAB ha usado siempre el formato IEEE de doble precisión. Hay un formato de precisión simple que ahorra espacio, pero que no es muy rápida en máquinas modernas. En esta ocasión trataremos con doble precisión. La mayoría de los números punto flotante diferentes de cero son normalizados. Estos pueden expresarse como: x=±(1+f)·2 e La cantidad f se le llama fracción o mantisa y a e exponente. La fracción satisface: 0≤f<1 52 y debe ser representado en sistema binario usando a lo más 52 bits. Es decir, 2 f es un número entero en el intervalo: 52 0≤2 f<2 52 El exponente e es un entero en el intervalo -1022 ≤ e ≤ 1023 La finitud de f es una limitación de precisión. La finitud de e es una limitación en rango. Cualquier número que no coincida con uno de los números en punto flotante del sistema IEEE debe ser aproximado por uno de ellos. Los números en punto flotante de doble precisión se almacenan en “palabras” de 64 bits, con 52 bits para f, 11 bits 11 para e, y 1 bit para el signo del número. El signo de e es almacenando en e + 1023, que está entre 1 y 2 -2. 11 Los dos valores extremos, el 0 y el 2 -1 del exponente, son reservados para los números de punto flotante excepcionales que describiremos más adelante. 1 Taller de Informática I Dpto. Computación – F.C.E. y N. - UBA e 2010 e+1 e-t Dentro de cada intervalo binario 2 ≤ x ≤ 2 los números están igualmente espaciados con un incremento de 2 . Si e -3 -2 = 0 y t = 3, por ejemplo, el espacio de los números entre 1 y 2 es 2 (1/8); el espacio entre los números 2 y 3 es 2 , etc. Mientras que e aumenta, el espacio aumenta. eps es la distancia de 1 al siguiente número en punto flotante. Antes del formato IEEE, diversas máquinas tenían distintos valores de eps. Ahora, para IEEE de precisión doble, eps = 2^(-52) - 16 El valor decimal aproximado del “eps” es: 2.2204x10 eps/2 o el eps (épsilon de la máquina) se puede llamar el nivel del roundoff (Redondeo). El error relativo máximo se comete cuando el resultado de una operación aritmética se redondea al número -53 punto-flotante más cercano, este error es eps /2=2 . La distancia o espacio relativo máximo entre los números punto-flotante es “eps”. En cualquier caso, podemos decir que el nivel del roundoff o de error relativo es cerca de 16 dígitos decimales Un caso frecuente del roundoff ocurre con la declaración simple de MATLAB: t = 0.1 El valor matemático t almacenado en “t” no es exactamente 0,1 porque la expresión de la fracción decimal 1/10 en binario requiere de una serie infinita. Dicha serie es: En realidad, la conversión de números entre las bases 2 y 16 es muy sencilla. Por ejemplo, el comando de MATLAB “format hex” aplicado a t=0.1 produce: >> t=0.1 t = 0.1000 >> format hex >> t t = 3fb999999999999a Es decir, el “format hex” es un comando que despliega el valor de “t” en forma hexadecimal. Los caracteres anteriores tienen distintos significados: 3fb 999999999999a Las letras de “a” a “f” representan los números 10 a 15 en forma hexadecimal. Los primeros tres caracteres, 3fb, nos dan la representación hexadecimal del decimal 1019, que es el valor del exponente en polarización negativa e+1023 si “e” es -4. Los otros 13 caracteres son la representación hexadecimal de la fracción “f” o mantisa. El valor almacenado en “t” es muy cercano, pero no exactamente igual, a 0.1 Algunas veces es importante hacer dicha distinción. Por ejemplo, la cantidad: 0.3/0.1 2 Taller de Informática I Dpto. Computación – F.C.E. y N. - UBA 2010 Esta cantidad no es exactamente igual a 3 porque el numerador real es un poco más pequeño que el 0.3 y el denominador real es poco más grande al valor almacenado de 0.1 0.1 (10)=3fb999999999999a(16) Observemos que cada cifra es una “palabra” de cuatro bits en el sistema binario. Así 3fb en binario es: 0011 1111 1011 que son los 12 primeros bits de t. El primer bit, 0, es el signo; por lo tanto t es positivo; y los restantes 11 bits representan el exponente. Las restantes cifras 999999999999a representan la fracción que en binario sería: 1001 1001 1001 · · · 1001 1010 ocupando los 52 bits correspondientes. Esto lo probamos haciendo 0.3/0.1 == 3 y obtenemos falso También podemos hacer (0.1 +0.1+0.1) -0.3 y no nos da 0 Representación de datos en Matlab Matlab utiliza aritmética de doble precisión y permite visualizar y representar números en diferentes bases con comandos simples Ejemplos: >>bin2dec(‘11011011’) Esta orden convierte a decimal el binario que se pasa como parámetro >>dec2bin(23) Convierte a binario el número entero que se pasa como parámetro >>dec2hex(1023) Convierte el parámetro a hexadecimal >>hex2dec(‘3ff’) Convierte a decimal el hexa que se pasa como parámetro >>hex2num(‘3fb 999999999999a’)Convierte según formato IEEE el parámetro a decimal Convierte según formato IEEE el parámetro a hexa >>num2hex(0.1) Ejemplos con error en representación (0.1 + 0.1 + 0.1) – 0.3 5.551115123125783e-017 La siguiente secuencia: a = 4/3 b = a – 1 0.33333333333333 1.33333333333333 3 Taller de Informática I Dpto. Computación – F.C.E. y N. - UBA c = 3*b 1.00000000000000 d=1–c 2.220446049250313e-016 2010 y no cero, como debería ser Formatos de Salida Respecto a los formatos numéricos con que MATLAB muestra los resultados (recuérdese que siempre calcula y almacena con doble precisión, es decir con unas 16 cifras decimales equivalentes), las posibilidades existentes se muestran en la lista desplegable de la Figura 21 y son las siguientes: short coma fija con 4 decimales (defecto) long coma fija con 15 decimales hex cifras hexadecimales bank números con dos cifras decimales short e notación científica con 4 decimales short g notación científica o decimal, dependiendo del valor long e notación científica con 15 decimales long g notación científica o decimal, dependiendo del valor rat expresa los números racionales como cocientes de enteros Estos formatos se pueden cambiar también desde la línea de comandos anteponiendo la palabra format. Por ejemplo, para ver las matrices en formato long habrá que ejecutar el comando: >> format long MATLAB mantiene una forma especial para los números muy grandes (más grandes que los que es capaz de representar), que son considerados como infinito. Por ejemplo, obsérvese cómo responde el programa al ejecutar el siguiente comando: >> 1.0/0.0 Warning: Divide by zero ans = Inf Así pues, para MATLAB el infinito se representa como inf ó Inf. MATLAB tiene también una representación especial para los resultados que no están definidos como números. Por ejemplo, ejecútense los siguientes comandos y obsérvense las respuestas obtenidas: 4 Taller de Informática I Dpto. Computación – F.C.E. y N. - UBA 2010 >> 0/0 Warning: Divide by zero ans = NaN >> inf/inf ans = NaN En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de respuesta, así como la de Inf, son enormemente importantes en MATLAB, pues permiten controlar la fiabilidad de los resultados de los cálculos matriciales. Los NaN se propagan al realizar con ellos cualquier operación aritmética, en el sentido de que, por ejemplo, cualquier número sumado a un NaN da otro NaN. MATLAB tiene esto en cuenta. Algo parecido sucede con los Inf. MATLAB dispone de tres funciones útiles relacionadas con las operaciones de coma flotante. Estas funciones, que no tienen argumentos, son las siguientes: eps devuelve la diferencia entre 1.0 y el número de coma flotante inmediatamente superior. Da una idea de la precisión o número de cifras almacenadas. En un PC, eps vale 2.2204e-016. realmin devuelve el número más pequeño con que se puede trabajar (2.2251e-308) realmax devuelve el número más grande con que se puede trabajar (1.7977e+308) Si cualquier cálculo intenta producir un valor más grande que realmax, se indica overflow (excede el límite). El resultado es un valor de punto flotante excepcional llamado infinito o Inf. Es representa-do tomando e = 1024 y f = 0 y satisface relaciones como 1/Inf = 0 e Inf+Inf = Inf. Si cualquier cálculo intenta producir un valor indefinido incluso en los reales, el resultado es un valor excepcional conocido como Not-a-Number (no es un número), o NaN. (Ej. 0/0, Inf-Inf). NaN es representado tomando e = 1024 y f distinto de cero. Si cualquier cálculo intenta producir un valor más pequeño que realmin, se indica underflow (por debajo del límite). Muchas pero no todas las máquinas permiten números de punto flotante excepcionales en el intervalo entre realmin y eps*realmin. El número subnormal positivo más pequeño es alrededor de 0.494e-323. Cualquier resultado más pequeño que éste se toma como 0. En máquinas sin valores subnormales, cualquier resultado más pequeño que realmin se toma como 0. Errores Sea x un número no representable por su largo excesivo y fl(x) su representación de punto flotante de largo adecuado, entonces, el error cometido por fl(x) será: • Por redondeo: • Por truncamiento: 1-t A la cantidad β , se le denomina épsilon de la máquina. Los errores numéricos se generan con el uso de aproximaciones para representar las operaciones y cantidades matemáticas. La relación entre el resultado exacto o verdadero y el aproximado está dada por: 5 Taller de Informática I Dpto. Computación – F.C.E. y N. - UBA 2010 Valor verdadero = aproximación + error De lo anterior se concluye que el error numérico resulta de la diferencia entre el valor verdadero y la aproximación, Ev = valor verdadero – aproximación Ev : Valor “exacto” o “verdadero” del error. Ejercicios 1) Un modo de conocer la precisión de un computador es escribir un programa que en cada iteración de un bucle realice la suma e incrementar k en una unidad, de modo que cuando la suma sea igual a 1.0 el bucle pare. Que la suma sea igual a 1.0 significa que hemos excedido la precisión del computador. Entonces k-1 es el número de bits de la mantisa y es la precisión o error de redondeo unitario del computador. Escribir un programa MATLAB que realice este proceso para deducir la precisión del computador Resolución: k=1; suma=1.0; while (suma + 2^(-k)) ~= suma k=k+1; end; k-1 %bits de mantisa = 52 2^(-k+1) %es eps!!! 2) Hallar el epsilon de la máquina para el sistema de punto flotante IEEE de doble precisión beta = 2; eps1 = 1.0; y = 2.0; while(y > 1.0) eps1 = eps1/ beta; y = 1.0+eps1; end eps1*beta % eps calculado eps % eps de la máquina Considere el cálculo de la función para "x" grande. Suponemos que trabajamos con seis cifras significativas. Veamos el caso de calcular f(100). Note que cifras. Ahora calculamos correctos a seis . El valor exacto a seis cifras de f(100) es de modo que perdimos tres cifras en el computo. ¿Cuál fue el problema? ¡Restamos cantidades similares! En este caso podemos evitar restar cantidades similares si rescribimos f (x) (racionalizando) como: Podemos ahora calcular f (100) mediante: 6