Make your own free website on Tripod.com

Propagación de Errores en las operaciones aritmética

 


 

Introducción

Turing demostró en 1936 que el conjunto de los números calculables o computables mediante ordenador (tales que existe un programa capaz de calcular sus dígitos uno a uno) es de cardinal numerable, como lo es el de los números algebraicos (los que son raíces de polinomios), los racionales (cociente de enteros) o los mismos naturales.

El conjunto de números reales es no numerable, por lo que elegido un número real aleatoria menté, este es imposible de calcular mediante un ordenador. Este hecho quizás parezca sorprendente, teniendo en cuenta que se utilizan los ordenadores para resolver todo tipo de problemas prácticos sin que este hecho sea relevante. Afortunadamente, el conjunto de los números calculables (igual que el de los racionales) es denso en el de los reales, es decir, dado un real, existe un número calculable tan próximo a este como queramos. Ese es el secreto de que los ordenadores sean útiles en computación científica. Aún así, y por ello, los ordenadores siempre cometen errores a la hora de representar un número.

Los ordenadores trabajan con una aritmética que utiliza un número finito de dígitos. Un número real tiene, salvo pocas excepciones, infinitos dígitos. Para representar este número en un ordenador tenemos que elegir un número finito de dígitos, lo que introduce un error en la representación de dicho número. Tener en cuenta estos errores introducidos por el ordenador es muy importante, sobre todo en aplicaciones en las que se realizan muchas operaciones aritméticas. Conforme realizamos estas operaciones el error se propaga, se acumula y en algunos casos puede llegar a crecer exponencialmente, provocando grandes errores en el resultado final. En esta unidad estudiaremos qué errores comete un ordenador, como se puede analizar su propagación, como detectar cuando van a ser perniciosos y, solo en algunos casos, como evitar sus efectos negativos.

Para empezar, presentamos dos problemas de la vida real que se han debido a la propagación de errores numéricos. Mencionaremos algunos conceptos, como representación en punto flotante, redondeo, aritmética binaria, etc., que serán introducidos mas adelante.

El 25 de febrero de 1991, durante la guerra del Golfo, una batería de misiles Patriot americanos en Dharan (Arabia Saudí) no logró interceptar un misil Scud iraquí. Murieron 28 soldados americanos. La causa: los errores numéricos por utilizar truncado en lugar de redondeo en el sistema que calcula el momento exacto en que debe ser lanzado el misil. Los ordenadores de los Patriot que han de seguir la trayectoria del misil Scud, la predicen

Punto a punto en función de su velocidad conocida y del momento en que fue detectado por última vez en el radar. La velocidad es un número real. El tiempo es una magnitud real pero el sistema la calculaba mediante un reloj interno que contaba décimas de segundo, por lo que representaban el tiempo como una variable entera. Cuanto más tiempo lleva el sistema funcionando mas grande es el entero que representa el tiempo. Los ordenadores del Patriot almacenan los números reales representados en punto flotantes con una mantisa de 24 bits. Para convertir el tiempo entero en un número real se multiplica este por 1/10, y se trunca el resultado (en lugar de redondearlo). El número 1/10 se almacenaba truncado a 24 bits. El pequeño error debido al truncado, se hace grande cuando se multiplica por un número (entero) grande, y puede conducir a un error significativo. La batería de los Patriot llevaba en funcionamiento más de 100 horas, por lo que el tiempo entero era un número muy grande y el número real resultante tenía un error cercano a 0.34 segundos.

El calculo seria: El número 1/10 es 1/24 + 1/25 + 1/28 + 1/29 + 1/212 +1/213 + …., e decir (0.0001100110011001100110011001100 …)2, que  almacenado en un registro de 24 bits conduce al número (0.00011001100110011001100)2 que introduce un error de (0.0000000000000000000000011001100…)2, igual en decimal a 0.000000095.

En 100 horas este pequeño error se multiplica y amplifica hasta alcanzar 0.000000095x100x60x60x10  en 0.34. Como un misil Scud viaja a unos 1676 m/s, es decir, unos 6000 km/hora, en 0.34 segundos recorre más de medio kilómetro. Esta distancia fue suficiente para que el misil Patriot no pudiera alcanzar al misil Scud y destruirlo.

El 4 de junio de 1996, el cohete Ariane 5 de la Agencia Europea del Espacio (ESA) explotó 40 segundos después de su despegue a una altura de 3.7 km. tras desviarse de la trayectoria prevista. Era su primer viaje tras una década de investigación que costo mas de 7000 millones de euros. El cohete y su carga estaban valorados en mas de 500 millones de euros. La causa del error fue un fallo en el sistema de guiado de la trayectoria provocado 37 segundos después del despegue. Este error se produjo en el software que controlaba el sistema de referencia inercial (SRI). En concreto, se produjo una excepción software debido al intento de convertir un número en punto flotante de 64 bits, relacionado con la velocidad horizontal del cohete respecto de la plataforma de lanzamiento, en un entero con signo de 16 bits. El número mas grande que se puede representar de esta forma es 32768. El intento de convertir un número mayor causó la excepción que provocó que el software de seguimiento de la trayectoria dejara de funcionar y en última instancia el accidente.

Representación de números en el ordenador

Para que un ordenador pueda manejar números naturales, enteros, racionales, reales o, incluso, complejos, es necesario representar estos números en memoria en un formato bien definido y suficientemente flexible. Además, todos los ordenadores tienen unidades aritmético-lógicas y/o coprocesadores aritméticos que realizan las operaciones numéricas que el ordenador necesita. La implementación física o hardware mediante circuitos electrónicos de estos dispositivos requiere una representación numérica adecuada de los números. Normalmente se utiliza una representación estática, que utiliza una cantidad fija de memoria, siempre la misma, para representar cada tipo de número. Esta representación facilita el diseño electrónico de estos circuitos. Nosotros estudiaremos en esta unidad sólo representaciones estáticas. Los lenguajes de programación de alto nivel, como Fortran o C, y la mayoría de los lenguajes matemáticos, como Matlab y también Mathematica, utilizan este sistema de representación de números. Sin embargo, existen también representaciones dinámicas que utilizan una cantidad de memoria variable en función de las necesidades de cada número concreto, como números naturales o números racionales, de longitud arbitraria. El programa matemático Mathematica, y Matlab a través de la Toolbox simbólica (basada en Maple), permiten aritmética exacta (con números racionales) de longitud arbitraria, sólo limitada por la memoria de la máquina. Sin embargo, su uso se reserva para aplicaciones muy específicas. Prácticamente no se utilizan en computación científico-técnica.

Estudiaremos la representación y el almacenamiento de números naturales, enteros y reales, estos últimos en punto flotantes. También se presentaría el estándar IEEE-754 de representación de números reales.

Números naturales y la regla de Horner

Para escribir números mediante símbolos en una hoja de papel se utiliza una representación en un sistema numérico. La forma habitual de representar números utiliza el sistema decimal o base 10. En esta representación un número natural se representa por una cadena de dígitos de la forma an an-1……. a1 a0 = a0 + a1 101 + ….+ an 10n; donde an pertenece [0,1…9] y cada digito se ve afectado por un factor de escala que depende de su posición. Por ejemplo: 123 = 1x102 +2x101+3x100. Los ordenadores digitales actuales no utilizan la base 10 para representar números y realizar operaciones aritméticas sino que prefieren el sistema binario o de base 2. Los dígitos en este sistema son 0 y 1, se denominan bits, y se representan físicamente mediante los dos estados de conducción (on) y corte (off) de un transistor funcionando como conmutador. Un ejemplo sencillo de representación de números enteros en base 2 es

(1101)2 = 1x23 + 1x22 + 0x21 + 1x20 = 8 + 4 + 1 = 13

Utilizaremos notación (.)b para indicar la base b utilizada en la representación de un numero, aunque omitiremos dicha notación para los números decimales (b = 10). Como vemos, para representar números en sistema binario son necesarios mas dígitos que en sistema decimal.

También se pueden utilizar representaciones en otros sistemas de numeración como el sistema octal, hexadecimal y otros.

Números reales en punto flotante

Convencionalmente, para representar los números reales se introduce el punto decimal. De esta forma, los números positivos menores que la unidad se representan como

0.a1a2……an = a110-1 + a210-2 + …. + an10-n.

Por ejemplo:

0.123 = 1x10-1 + 2 x10-2 + 3x10-3; y de igual forma

456.123 = 4 x102 + 5x10 + 6 + 1x10-1 + 2x10-2 + 3x10-3

Dado que los números reales pueden tener un número infinito de dígitos, los números reales se representan en un ordenador mediante un formato denominado de punto flotante, que utiliza solo un número finito de dígitos.

Errores, condicionamiento y estabilidad numérica

Los números reales representados en punto flotantes son los más utilizados, con diferencia, en computación científica. Como hemos observado al normalizar un número real se comete un error. Incluso números con una representación finita en decimal, como 0.1, o 27.9, tienen una representación binaria infinita, tienen decimales binarios periódicos. Por ello, cuando estos números se almacenan en punto flotante se debe “cortar” este número a una cantidad finita de bits, y se incurre en un error de representación flotante. Estos errores, de truncado o redondeo, son inevitables en toda computación científica. Tenemos que estudiar cuanto vale estos errores y como medirlos. Además, cuando un ordenador realiza operaciones elementales como sumar o multiplicar números también incurre en un error adicional, que como veremos es similar al de normalización.

Un método numérico conlleva la realización de gran número de operaciones aritméticas, todas y cada una de ellas incurren en errores pequeños. Estos pequeños errores se pueden acumular y crecer catastróficamente conforme aumentan el número de  operaciones conduciendo a un resultado final de muy baja exactitud. Estudiaremos como medir los errores de un método numérico como un todo, así como de que manera determinar si un método sufre crecimiento de los errores (es numéricamente inestable) o no (es numéricamente estable).

Una manera de medir si un método es inestable es estudiando su sensibilidad o condicionamiento a los errores. Veremos como se puede calcular una medida de este concepto. A veces, operaciones muy sencillas, como la suma o la resta, pueden incurrir en una gran pérdida de exactitud en el resultado. Como ejemplo presentaremos el caso de la cancelación catastrófica. El condicionamiento de un algoritmo numérico para resolver un problema dado, su estabilidad numérica, ésta relacionada con la propia estabilidad del problema original. Un problema inestable conducirá a métodos numéricos inestables. Pero para un problema estable también es posible que algunos métodos sean inestables. De allí que el condicionamiento y la estabilidad numérica de un método sean factores importantes a estudiar.

Errores relativos de truncado y redondeo

Un punto importante a no olvidar es la diferencia entre precisión y exactitud. Al representar un número real en un ordenador se comete un error. Este error se denomina precisión del número y depende solo del formato de representación que se utilice. Cuando se obtiene un resultado tras aplicar un método numérico, el error de este resultado nos da la exactitud del mismo. El resultado puede, como número representado, tener una precisión alta aunque su exactitud sea baja. La exactitud depende de como se han acumulado los errores en el resultado. Además, se puede obtener un resultado de mayor exactitud que la precisión con la que se opera, por ejemplo, cuando se utiliza para simular aritmética de mayor precisión, o se utiliza aritmética de precisión infinita.

Para medir este error hay dos procedimientos posibles, calcular su error absoluto y su error relativo (también llamado porcentual).

El error absoluto: ea de un número b como aproximación a otro número a es la diferencia entre ellos, ea=b-a, luego b=a+ea. A veces se define este error en valor absoluto, ea=ú b-aú

Por ejemplo, si b aproxima a a=22.43 con un error absoluto ea = 0:01221, entonces b = 22.44 coincide con a en aproximadamente 4 dígitos. Sin embargo, con ese error absoluto, pero con a = 0.02243, el número b = 0.03464 no coincide con a en ninguno de sus dígitos. Aunque un error de 0.01 pueda parecer pequeño, lo será sólo si el número original es grande. Por ello, el error absoluto no nos permite decidir correctamente si un error es grande o no lo es.

El error relativo: er de un número b como aproximación a otro a se define como:

er = (b – a)/a; b = a + er a = a (1 + er)

A veces se define utilizando valores absolutos. Se observara que para a = 0, el error relativo es infinito, lo que es correcto, ya que todo número, por muy pequeño que sea, es infinitamente grande comparado con cero, y todos sus (infinitos) dígitos pueden ser diferentes de cero.

Ilustremos el error relativo con el ejemplo anterior. Sea b un numero que aproxima con un error relativo er = 0:01221 a a = 22:43, entonces b = 22:70 cuyos dos dígitos mas significativos coinciden con a. Para a = 0:02243, con el mismo error relativo, tenemos b = 0:02270, que también coincide en dos dígitos significativos con a. De esta forma vemos que el error relativo nos indica claramente el número de dígitos en los que coinciden el número original y su aproximación. Podemos interpretar el error relativo de forma porcentual, si lo multiplicamos por 100. Por ejemplo, el error relativo er = 0:01 significa un error del 1%. Cuando decimos que dos números se aproximan hasta en un 5% queremos decir que su error relativo es de 0:05.

Para representar un número real en un ordenador hay que elegir un número en punto flotante adecuado. A priori, se debería elegir el más cercano, sin embargo esto no es posible siempre salvo que conozcamos todos los dígitos de dicho número y eso no es posible en muchos casos.

En la práctica necesitamos un procedimiento que sólo requiera, como mucho, un único digito más de los necesarios para representar el número. Utilizando esta condición tenemos que hay dos posibilidades, el truncado y el redondeo.

 

Bibliografía

Tema 2. Aritmética flotante y análisis de errores. [Documento en línea]. Disponible: http://www.lcc.uma.es/~villa/tn/tema02.pdf. [Consultada: 2005, Enero 23]

 


Web diseñada y Administrada por: Irlenys Tersek (Ingeniero Electrónico en Computación)
E-mail: irlenys@hotmail.com, irlenyst@yahoo.com,  irlenystersek@cantv.net

Fecha de Actualización:19/12/2005