Errores en las Operaciones Aritméticas Matemáticas de la Especialidad (Mecánica-Máquinas) Madrid, 8 de octubre de 2001 Javier García de Jalón ETSII - Departamento de Matemática Aplicada a la Ingeniería Industrial Errores en los Resultados de los Cálculos Tipos de errores: Modelización, Truncamiento, Discretización, Redondeo Errores de Modelización o Idealización Debidos a las hipótesis realizadas para convertir un modelo real en un modelo matemático: sólido rígido, pequeños desplazamientos, material homogéneo e isótropo, diferentes teorías de fleión,... Errores de Truncamiento Debidos a la sustitución de un proceso infinito por otro finito: series de Taylor, funciones de interpolación en elementos finitos,... Errores de Discretización Debidos a la sustitución de un proceso continuo por otro discreto, o de un infinitésimo por una cantidad finita: diferencias finitas, elementos finitos, integración numérica,... Errores de Redondeo Debidos al número limitado de cifras que almacena el ordenador Lo ideal es que los distintos errores mantengan un cierto equilibrio 1
Eemplo 1: Errores en una suma sencilla El siguiente programa de Matlab % fichero suma01.m suma=0; n=1000000 for i=1:n suma=suma+0.1; end suma, eabs=n/10-suma, erel=(n/10-suma)/(n/10) da como resultado n = 1000000 suma = 1.000000000013329e+005 eabs = -1.332882675342262e-006 erel = -1.332882675342262e-011 (0.1) = (0.00011001100110011...) 10 2 1011011100110.111010011000 + 1011011100111.000000110001.000110011001100110011001100= Este error es mucho más elevado de lo que cabría esperar. Causas: El número 0.1 no es eacto en base 2 Cuando suma crece se desprecian más cifras de 0.1 Eemplo 2: Diferencia entre números El siguiente programa de Matlab evalúa la misma función de dos formas diferentes function dife1 =logspace(1,8,8); f=f() g=g() dif=g-f function ff=f() ff=.*(sqrt(+1)-sqrt()); function gg=g() gg=./(sqrt(+1)+sqrt()); ( ) f( ) = * + 1 g ( ) = + 1 + y da como resultado f = 1.0e+003 * 0.00154347130187 0.00498756211209 0.01580743742896 0.04999875006249 0.15811348772559 0.49999987504634 1.58113879024313 5.00000005558832 g = 1.0e+003 * 0.00154347130187 0.00498756211209 0.01580743742896 0.04999875006250 0.15811348772569 0.49999987500006 1.58113879055572 4.99999998750000 dif = 1.0e-004 * 0.00000000002220 0.00000000032863-0.00000001803002 0.00000010651036 0.00000101522346-0.00046279410526 0.00312590145768-0.68088316766080 2
Eemplo 3: Evaluación de sucesiones El siguiente programa de Matlab evalúa una sucesión de tres formas diferentes % fichero suces1.m (1)=1; (2)=1/3; p(1)=1; p(2)=1/3; q(1)=1; q(2)=1/3; for n=1:20 (n+2)=1/3^(n+1); % valor eacto p(n+2)=4*p(n+1)/3-p(n)/3; q(n+2)=10*q(n+1)/3-q(n); disp(['n=',num2str(n+2,4),' =',num2str((n+2),14),' p=',num2str(p(n+2),14),' q=',num2str(q(n+2),14)]); end y da como resultado n=1 =1. p=1. q=1. n=2 =0.33333333333333 p=0.33333333333333 q=0.33333333333333 n=3 =0.11111111111111 p=0.11111111111111 q=0.11111111111111 n=4 =0.037037037037037 p=0.037037037037037 q=0.037037037037036... n=14 =6.2722547438631e-007 p=6.272254743846e-007 q=6.2719238832859e-007 n=15 =2.0907515812877e-007 p=2.0907515812706e-007 q=2.0897589995562e-007 n=16 =6.9691719376256e-008 p=6.9691719374552e-008 q=6.9393944856812e-008 n=17 =2.3230573125419e-008 p=2.3230573123715e-008 q=2.2337249567086e-008 n=18 =7.7435243751396e-009 p=7.7435243734353e-009 q=5.063553700141e-009 n=19 =2.5811747917132e-009 p=2.5811747900089e-009 q=-5.4587372332825e-009 n=20 =8.6039159723773e-010 p=8.6039159553347e-010 q=-2.3259344477749e-008 n=21 =2.8679719907924e-010 p=2.8679719737498e-010 q=-7.2072411025882e-008 n=22 =9.5599066359748e-011 p=9.5599064655482e-011 q=-2.1698202560852e-007 1 1 n = ; n n = n 1 3 3 4 1 1 1 pn = pn 1 pn 2; p0 = 1, p1 = ; pn = A + B ( A= 1, B = 0 n ) 3 3 3 3 10 1 1 n qn = qn 1 qn 2; q0 = 1, q1 = ; qn = A + B 3 A= 1, B = 0 n 3 3 3 ( ) Eemplo 4: Inversión de una matriz El siguiente programa de Matlab % fichero hilbert1.m clear all n=10; for i=1:n for =1:n A(i,)=1/(i+-1); end end B=inv(A); error=norm(b*a-eye(n)) da como resultado» error = 1.117171034133376e-004 es decir que se han perdido unas 12 cifras significativas 1 Condición numérica de una matriz b b κ ( A) b κ ( A) κ ( A) = A A A A A 3
Introducción a los errores de redondeo En un ordenador los números se representan con un nº finito de cifras Ciertos números no se pueden representar eactamente y al aproimarlos se comete un error Los resultados de muchas operaciones aritméticas tienen más cifras de las que se puede almacenar y hay que aproimarlos eliminando las cifras menos significativas. A este proceso se llama "redondeo" Redondeo simétrico Redondeo truncado Los errores de redondeo son inevitables, pero controlables En muchas ocasiones son poco significativos y no tienen ninguna importancia Sin embargo, en algunos problemas pueden llegar a destruir por completo el significado de un resultado. Conviene detectar estos casos y tomar las medidas adecuadas Unos errores de redondeo catastróficos pueden ser consecuencia de un problema difícil, de un mal algoritmo, o de ambas cosas a la vez Tipos de variables y de almacenamiento El tipo de dato en la realidad determina el tipo de variable que se debe utilizar en un programa. Los ordenadores disponen de diversos tipos de datos. Eemplos: Char o String, para almacenar caracteres alfanuméricos Integer, para numerar las filas y columnas de una matriz no muy grande Long, para numerar los habitantes de una ciudad Logical, para una opción con sólo dos valores (sí, no; true, false) Single, para variables físicas que no eian mucha precisión Double, para variables físicas que eian precisión Currency, para cantidades grandes de dinero Se debe utilizar el tipo de dato más sencillo que represente correctamente el dato real Se pueden numerar los elementos de un conunto con Double en vez de con Long o con Integer, pero ocupará más memoria y las operaciones serán más lentas Matlab utiliza fundamentalmente variables tipo Double 4
Sistemas binario, octal, decimal y headecimal Decimal Binario Octal Headec. 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 16 10000 20 10 17 10001 21 11 La mayor parte de los ordenadores modernos utilizan el sistema binario Cambio de base Paso de base 8 a base 10 4725 8 = 4 8 3 + 7 8 2 + 2 8 + 5 = 2517 Paso de base 10 a base 8 2517 10 =4725 8 2517 = 314 8 + 5 314 = 39 8 + 2 39 = 4 8 + 7 Paso de base 10 a base 2 2517 10 =100111010101 2 Es fácil pasar de base 8 a base 2 sin más que concatenar las conversiones de los dígitos octales a base 2 4725 8 =100 111 010 101 2 2517 = 1258 2 + 1 1258 = 629 2 + 0 629 = 314 2 + 1 314 = 157 2 + 0 157 = 78 2 + 1 78 = 39 2 + 0 39 = 19 2 + 1 19 = 9 2 + 1 9 = 4 2 + 1 4 = 2 2 + 0 2 = 1 2 + 0 5
Almacenamiento de variables enteras Los enteros se guardan en 2, 4 u 8 bytes Con 16 bits se pueden guardar: 2 16 = 65.536 Si se reserva un bit para el signo: 2 15 = 32.768 Rango de enteros representables: -32.768 < número < 32.767 Con 32 bits se pueden guardar: 2 32 = 4.294.967.296 Si se reserva un bit para el signo: 2 31 = 2.147.483.648 Rango de enteros representables: -2.147.483.648 < número < 2.147.483.647 Forma interna de representar los enteros con signo Codificación independiente del signo Complemento a uno Complemento a dos (Intel) Por eceso a 2 N-1-1 (eponentes de números de punto flotante) Almacenamiento de variables enteras (2) Codificación independiente del signo N 2 s N 2 N 3 2 1 0 = 0 { } sd d... ddd ( 1) d 2, sd, 0,1 0000...0000 0 1000...0000 0 0000...0001 1 1000...0001 1...... N 1 N 1 0111...1111 2 1 1111...1111 ( 2 1) Complemento auno N-1 N-1 = 0 = 0 d 2 - (1- d )2 0000...0000 0 1111...1111 0 0000...0001 1 1111...1110 1...... N 1 N 1 0111...1111 2 1 1000...0000 (2 1) Complemento ados ( Intel) N-1 N-1 = 0 = 0 d 2-1 + (1- d )2 0000...0000 0 0000...0001 1 1111...1111 1...... N 1 1000...0000 2 N 1 N 1 0111...1111 2 1 1000...0001 (2 1) Por eceso a N 1 N 2 2 1 0 N 1 2 1 d d... ddd 0 d d ddd N-1 N 1 N 2... 2 1 0 -(2-1) N-1 0000...0000-2 + 1 +... 0111...1111 0 1111...1111 2 N-1 0000...0001-2 2 1000...0000 1 N 1 6
Variables de punto flotante Estandarizadas por IEEE 784:1985 y IEC 559:1989 Simple precisión (32 bits) 1 8 23 Doble precisión (64 bits) 1 11 52 Elementos: signo, eponente, mantisa Signo: independiente de resto. Simetría respecto a cero Mantisa: nº real, no negativo, con punto fio m =. ddd... d = d 2 + d 2 +... + d 2 p 1 2 1 2 3 p 1 2 p Eponente: valor entero entre e min y e ma Otras características Normalización: Para evitar ambigüedades se eige d 1 0. Desnormalización: Se permite d 1 =0 cuando el eponente es e=e min. Éste es el criterio para reconocerlos. De esta forma se recuperan los números pequeños. Variables de punto flotante (2) Un conunto de números de punto flotante F queda determinado por cinco parámetros F(base, p, e min, e ma, denorm) Para los procesadores Intel estos valores son F(2, 24, 126, 127, true) simple precisión F(2, 53, 1022, 1023, true) doble precisión F(2, 64, 16382, 16383, true) precisión etendida Los eponentes se guardan por eceso a 2 N-1 1 Con 11 bits, sin bit de signo, se almacenan enteros entre 0 y 2048 Bit oculto El valor real del eponente es (e 1023), con lo cual 1023 e 1024 En la práctica se hace e min = 1022, e ma =1023 Como en los números normalizados d 1 =1 y en los desnormalizados d 1 =0, no es necesario almacenar este bit y se dispone de un bit adicional para la mantisa La mantisa es entonces 1.d 1 d 2 d 3...d p y cumple la condición 1 m<2 7
Variables de punto flotante (3) Números máimo y mínimo representables Los números de punto flotante normalizados y mayores que cero se encuentran en el intervalo (sin y con bit oculto) 1 emin p ema emin p ema [2 2, (1 2 ) 2 ] [1 2, (2 2 ) 2 ] Los números desnormalizados están en el intervalo p emin p emin [2 2, (1 2 ) 2 ] Distancia entre dos números consecutivos La distancia absoluta entre números normalizados varía para cada valor del eponente, pero en el intervalo [2 e, 2 e+1 ] es constante y viene dada por 2 p 2 e 2 e = = p = u 2 e donde u = 2 -p es el llamado incremento básico Valor eps: mínimo número que sumado a 1 da un resultado 1 Se verifica que eps=u Variables de punto flotante (4) Distancia relativa La distancia relativa entre números consecutivos positivos normalizados es / = 2 e-p /(m() 2 e ) = 2 -p /m() epresión que permanece casi constante, pues depende del valor de la mantisa m(), que varía 1/2 y 1-2 -p, sin bit oculto, pero no depende del valor de e Vacío alrededor del cero (números normalizados) Entre 0 y 2-1 2 emin (sin bit oculto) no hay ningún número en F Sin embargo entre 2-1 2 emin y 2-1 2 emin+1 hay números cada u=2 -p Con números desnormalizados entre 0 y 2-1 2 emin hay números cada u=2 -p 0 2-1 2 emin 2-1 2 emin+1 0 2-1 2 emin 2-1 2 emin+1 Números ±infinito, ±0 y NaN (Not a Number) Los ceros con signo (+0 y 0) se representan con m=0 y e=e min 1 Los infinitos (+ y ) se representan con m=0 y e=e ma +1 Los Not a Number ó NaNs se representan con m 0 y e=e ma +1 8
Sistema numérico de Matlab Utiliza 64 bits Un bit de signo, 11 bits de eponente con eceso a 2 10-1=1023, y 53 bits para la mantisa (hay un bit oculto de más) de modo que los números normalizados no nulos son de la forma s e ( 1) 1.m 2 Eemplo 1 7 ( 1) 1.984375 2 = ( 254) (c06fc00000000000) 16 = (1100 0000 0110 1111 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000) 2 s = 1; e = (100 0000 0110) 2 -(2 10-1) = 1030-1023 = 7 m = 2-1 + 2-2 + 2-3 + 2-4 + 2-5 + 2-6 = 0.984375 10 Sistema numérico de Matlab (2) Valores particulares emin = -1022 ema = 1023 eps = (3cb0000000000000) 16 = 1.0 2-52 1 = (3ff0000000000000) 16 = 1.0 2 0 1+eps = (3ff0000000000001) 16 realma= (7fefffffffffffff) 16 = (2-eps) 2 1023 realmin= (0010000000000000) 16 = 1.0 2-1022 +0 = (0000000000000000) 16 s=0 m=0 e=-1023-0 = (8000000000000000) 16 s=1 m=0 e=-1023 NaN = (fff8000000000000) 16 m 0 e= 1024 +Inf = (7ff0000000000000) 16 s=0 m=0 e= 1024 -Inf = (fff0000000000000) 16 s=1 m=0 e= 1024 1/realma=(0004000000000000) 16 s=0 m 0 e=-1023 9
Aritmética de punto flotante Redondeo. Eemplo en base 10 (manteniendo 6 cifras) : Con redondeo truncado: 0.8472765924576 0.847276 Con redondeo simétrico: 0.8472765924576 0.847277 Números en F entre los que está un número en R Dado un número positivo =1.d 1 d 2...d 23 d 24...d 52 d 53... 2 e el valor anterior se obtiene truncando los bits que eceden de p: =1.d 1 d 2...d 23 d 24...d p 2 e El valor inmediatamente superior será + =(1.d 1 d 2...d 23 d 24...d p +2 -p ) 2 e Errores de redondeo Con redondeo truncado el error es menor que la diferencia + o que el valor de la última cifra retenida -fl()<10-6 Con redondeo simétrico el error es menor que + /2 o que la mitad del valor de la última cifra retenida -fl()<1/2 10-6 Errores absolutos y relativos Errores absolutos -fl() Errores relativos -fl() / Propagación de errores Errores de las operaciones aritméticas Los registros de la CPU tienen más precisión. Puede suponerse que las operaciones se realizan eactamente y luego se redondea el resultado Sea el resultado eacto de una operación aritmética cualquiera (+,, *, /) El error relativo y la relación entre el valor aproimado y el eacto serán y fl( y) p 1 δ = < 2 fl( y) = ( y)(1 + δ) y Al valor δ se le denomina error de redondeo unitario, y es un límite superior para el error relativo de cualquier operación. En doble precisión δ=2 -p-1 =2-53 Si hay varias operaciones consecutivas los errores se propagan en la forma fl( + ( y+ z)) = ( + fl( y + z))(1 + δ ) = = ( + ( y+ z)(1 + δ ))(1 + δ ) = 2 1 = ( + y + z) + ( y+ z) δ + ( + y + z) δ + ( y+ z) δδ El resultado depende del orden de las operaciones aritméticas. Conviene operar primero con los sumandos más pequeños. 1 2 1 1 2 ( + y + z) + ( y+ z) δ + ( + y + z) δ < ( + y+ z)(1 + δ + δ ) 2 1 1 2 10
Problemas mal condicionados Son aquellos problemas en los cuales los errores tienden a crecer en una forma incontrolada, potencial o eponencial, superior por tanto a un crecimiento lineal con el número de operaciones aritméticas La "condición" de un problema es la sensibilidad de los resultados a pequeñas variaciones en los datos. Si es muy grande pueden esperarse dificultades aunque los datos iniciales sean eactos, pues los errores numéricos tenderán a amplificarse A veces se puede estimar teóricamente la condición de un problema Para una función, mediante el Teorema del Valor Medio f( + h) f( ) = f ( ξ ) h f ( h ) f( + h) f( ) hf ( ) f ( ) h = f( ) f( ) f( ) Para la solución de sistemas de ecuaciones lineales b b A A κ( A) κ( A) κ( A) = A A b A El remedio es utilizar más cifras significativas 1 Problemas mal planteados (alg. inestables) Diferencia de números parecidos La resta entre números de una magnitud parecida puede hacer perder varias cifras significativas La solución es tratar de realizar las operaciones de otra forma.453920186823497.453920172041866.000000014782631=.147826310000000 10 Orden de las operaciones de acumulación Si se suman primero los términos más pequeños se pierden menos cifras significativas que si se empieza sumando los términos de mayor valor Comparaciones Signo de números pequeños: Para saber si un número pequeño es mayor que cero conviene establecer un valor límite (1e-12, por eemplo) pues los números próimos a cero pueden tener un signo u otro según los errores de redondeo Comparación de números de punto flotante: Nunca se deben comparar con el operador == directamente. Hay que ver si el valor absoluto de su diferencia dividido por el valor absoluto del número es menor que un determinado número pequeño (1e-12, por eemplo) -7 11