En este capítulo estudiaremos como se representan los números en la computadora. Por limitaciones fisicas, los números solo se pueden representar con un número finito de cifras en la computadora. Al igual las operaciones aritméticas que se efectuan en la computadora no corresponden a las operaciones matemáticas exactas. Veremos pues como estas limitaciones en la representación de los números y las operaciones ariméticas afectan los computos y la propagación de errores.
Veamos primero las distintas formas de representar números en terminos de bases distintas. Por ejemplo el número 231.12 base dies se interpreta como:
(231.12)10 = 2 x 102 + 3 x 101 + 1 x 100 + 1 x 10-1 + 2 x 10-2
Otro ejemplo seria:
(101.11)2 = 1 x 22 + 0 x 21 + 1 x 20 + 1 x 2-1 + 1 x 2-2 = 4 + 1 + ½ + ¼ = (5.75)10
Un ejemplo menos trivial es el siguiente:
donde usamos que
Hemos visto aqui como convertir un número binario a su decimal correspondiente. Veamos ahora como convertimos de decimal a binario. Mostramos aqui el procedimiento convirtiendo (217.732)10 a binario. Trabajamos primero con la parte entera del número. Dividimos esta sucesivamente por dos y llevamos registro de los residuos sucesivos hasta que el cociente sea cero. Estos reciduos desde el último hasta el primero, forman la representación binaria de la parte entera. Veamos
divisor |
dividendo |
cociente |
residuo |
2 |
217 |
108 |
1 |
2 |
108 |
54 |
0 |
2 |
54 |
27 |
0 |
2 |
27 |
13 |
1 |
2 |
13 |
6 |
1 |
2 |
6 |
3 |
0 |
2 |
3 |
1 |
1 |
2 |
1 |
0 |
1 |
Asi que (217)10=(11011001)2. Para la parte fraccional, multiplicamos sucesivamente por dos y llevamos cuenta cada ves que el resultado sea mayor de uno ó no. Veamos
2(0.732)=1.464 |
0.464 |
1 |
2(0.464)=0.928 |
0.928 |
0 |
2(0.928)=1.856 |
0.856 |
1 |
2(0.856)=1.712 |
0.712 |
1 |
2(0.712)=1.424 |
0.424 |
1 |
|
|
|
En este caso el proceso sigue indefinidamente y escribimos (0.732)10=(0.10111 )2. Combinando los dos cálculos tenemos (217.732)10=(11011001.10111 )2.
En los números hexadecimales o base 16 los digitos son
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}
Aqui (A)16=(10)10, (B)16=(11)10, etc. Por ejemplo
(CD.B9)16=(12 x 161 + 13 x 160 + 11 x 16-1 + 9 x 16-2)10
Los métodos para cambiar de binario a hexadecimal y viceversa son extremadamente sencillos. Historicamente las bases binaria, hexadecimal, y octal han sido las más utilizadas para representar números en la computadora. Esto es básicamente por que el circuito electrico más básico se puede representar por uno si hay corriente ó cero si no hay corriente. Lo que lleva naturalmente al sistema binario como forma de representar el estado del circuito. Esto con lo relativamente fácil de pasar de una base a otra hace que las bases binaria, hexadecimal, y octal sean utilizadas eficientemente para diseñar computadoras.
Sea "x" un número real base dies ó dos. Podemos representar a "x" en forma única como sigue:
(2.1)
donde , "e"
es un entero positivo ó negativo,
, y
es dies ó
dos. Por ejemplo
(-117.32)10 = -(0.11732)10 x 103 , (1101.11)2 = (0.110111)2 x 24
La representación de punto flotante del número "x" se
denota por fl(x) y consiste de (2.1) con alguna restricción en el
número de cifras en
y el tamaño
de "e". Tenemos pues que
(2.2)
donde N,M son positivos y
,
. Los
ai's se obtienen de alguna forma a partir de
. El número
se conoce como
la mantisa y "t" el número de cifras o largo de
mantisa. Si alguna operación aritmética produce un resultado
con e > M decimos que hubo un overflow. Por el contrario si en
el resultado, e < -N decimos que hubo un underflow.
Se puede verificar que "t" cifras en la mantisa equivalen aproximadamente a "t" cifras significativas en la misma base. Ademas "t" digitos binarios equivalen a "t log102" digitos base dies.
Veamos ahora varias cantidades importantes del sistema (2.2):
La dos formas más comunes de calcular la mantisa son:
con las reglas correspondientes base dos.
Tenemos ahora el teorema que nos habla sobre el error en estas dos reglas:
Teorema (2.1):
donde
Note que el error en redondeo es en general la mitad del error en truncación. También se puede verificar que como los errores en redondeo varian en signo, estadisticamente "en promedio" tienden a cancelarce. Esta cancelación no es tan probable con truncación. A pesar de estas ventajas la truncación es usada comunmente en el diseño de computadoras por lo fácil de su implementacion a nivel de "hardware".
La gran mayoria de las computadoras construidas en los últimos quince
años utilizan lo que se conoce como el estandar de aritmética
de punto flotante de la IEEE. Esto uniformizó los procesos de
representación de números en computadoras distintas facilitando
asi las comparaciones y análisis de errores. En este estandar
y el flotante
de un número tiene la forma:
(2.3)
donde "f" es ahora la mantisa y satisface
y se representa
con t cifras binarias. Los valores usados para t y e son como sigue:
La presición sencilla economiza memoria pero no es mucho más rapida que la presición doble en las computadoras modernas. La distribución de los números de punto flotante en la recta numérica es una nouniforme. De hecho para un exponente "e" dado, los números de punto flotante entre 2e y 2e+1 estan uniformemente distribuidos con incremento 2e-t. Ilustramos esto aqui para el estandar de la IEEE con un sistema trivial donde f y e tienen dos y tres digitos binarios respectivamente. Los números de punto flotante de este sistema los podemos enumerar en la siguiente tabla:
1+f \ e |
-2 |
-1 |
0 |
1 |
2 |
3 |
1.00 |
¼ |
½ |
1 |
2 |
4 |
8 |
(1.01)2=1.25 |
5/16 |
5/8 |
5/4 |
5/2 |
5 |
10 |
(1.10)2=1.50 |
3/8 |
¾ |
3/2 |
3 |
6 |
12 |
(1.11)2=1.75 |
7/16 |
7/8 |
7/4 |
7/2 |
7 |
14 |
Si ordenamos estos números en forma ascendente obtenemos:
Podemos observar aqui que la densidad de los números de punto flotante disminuye con su tamaño. Podemos también observar esto gráficamente en la siguiente figura:
El número positivo más grande en el estandar de la IEEE esta dado por:
Este número se denota en MATLAB por realmax. Cualquier resultado numérico que produsca un número mayor que realmax se conoce como un overflow y se denota por Inf (infinito) y se representa en (2.3) tomando f=0 y e=1024 en presición doble. El número Inf satisface las relaciones 1/Inf=0 y Inf+Inf=Inf.
El correspondiente número positivo más pequeño es:
y se denota en MATLAB por realmin. Cualquier resultado numérico que produsca un número menor que realmin se conoce como un underflow y en muchas computadoras el resultado se iguala a cero pero esto no es estandar. Calculos como 0/0, Inf-Inf que pueden conllevar a resultados indefinidos se denotan por NaN (not a number).
El epsilon de la máquina esta dado en este sistema por 2-t y se denota en MATLAB por eps. Este número corresponde al incremente de los números entre 1 y 2 en el sistema de punto flotante. eps corresponde al error relativo (ver definición más adelante) minimo posible en cualquier computo numérico en el sistema de punto flotante. Toda operación aritmética en la computadora o la representación de punto flotante de un número, induce un error relativo no mayor de eps.
En la siguiente tabla ilustramos estas cantidades especiales con sus respectivas representaciones binarias en la computadora en presición doble:
Número |
Signo |
Exponente |
Mantisa |
realmax |
0 |
111 1111 1110 (si ponemos 1 al final corresponde a overflow) |
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 |
realmin |
0 |
000 0000 0001 (exponente mas pequeño antes de underflow) |
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
-realmin |
1 |
000 0000 0001 |
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
eps |
0 |
011 1100 1011 (-52+1023) |
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
0 |
0 |
000 0000 0000 (exponente de underflow) |
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
1 |
0 |
011 1111 1111 (0+1023) |
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
realmin/2 |
0 |
000 0000 0000 (situación de underflow) |
1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
Como vimos antes, el uso de un número finito de cifras en la representación de punto flotante introduce errores de representación. Aún cuando los números en cuestión se puedan representar en forma exacta en la computadora, estos podrián contener error, por ejemplo si son datos experimentales. Queremos ver como estos errores en los datos se propagan al usar las operaciones aritméticas usuales o más general al evaluar funciones.
Denotamos por xt el valor real o exacto de una cierta cantidad y xa una aproximación de xt obtenida experimentalmente ó al truncar xt para representarlo en la computadora. Definimos los errores absolutos y relativos respectivamente en xa como aproximación de xt por:
Error(xa) = xt - xa , Rel(xa) = Error(xa)/xt
Se puede demostrar que si
, entonces
xa tiene por lo menos m cifras significativas como aproximación
de xt.
Ejemplo 1: Si tomamos xt=exp(1) y xa=2.718, tenemos que Error(xa)=2.8183e-004 y Rel(xa)=1.0368e-004.
Uno de los ejemplos más comunes de la propagación de errores es en el fenomeno conocido como perdida de cifras significativas. Este tipo de situación se da cuando algún cálculo numérico envuelve la resta de dos cantidades similares ó en el cálculo de un número por medio de una sumatoria donde el resultado es mucho menor que los terminos de la sumatoria los cuales alternan en signo. Veamos algunos ejemplos:
Ejemplo 2: 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
correctos
a seis cifras. Ahora calculamos
. El valor
exacto a seis cifras de f(100) es
de modo que
perdimos tres cifras en el computo. ¿Cúal fué 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:
que es correcto a seis cifras. Una situación similar ocurre al usar
la fórmula cuadrática. En particular considere la ecuación
x2+bx+c/4=0 donde b>0 y c es mucho más pequeño
que b. Entonces como el discriminante
, vamos a tener
cancelación de cifras al calcular la raiz con el "+" en la fórmula
cuadrática. Aqui nuevamente una racionalización de la fórmula
problemática resuelve el asunto. Si b<0, la raiz problemática
es la del "-".
Ejemplo 3: Considere el problema de evaluar
para "x" cerca de cero. Como
para "x" cerca
de cero, tenemos resta de cantidades similares y por consiguiente habrá
perdida de cifras significativas. Ilustramos aqui el uso de polinomios de
Taylor para obtener representaciones ó aproximaciones de la función
que no conlleven perdida de cifras significativas. Por el Teorema de Taylor
tenemos que:
donde esta
entre 0 y x. Tenemos ahora que
Note que si ,
entonces
Podemos pues aproximar a f(x) mediante
con un error absoluto del orden de 10-11 y no hay perdida de cifras significativas al calcular con la fórmula aproximada.
Ejemplo 4: Otro caso común de cancelación de cifras significativas ocurre en el cálculo de un número mediante una sumatoria donde los terminos de la sumatoria son mucho mayores que el resultado y alternan en signo. Considere el problema de evaluar el polinomio f(x) = x7-7x6+21x5-35x4+35x3-21x2+7x-1. El siguiente código en MATLAB evalua el polinomio en el intervalo [0.988,1.012] y lo grafica:
x=linspace(0.988,1.012,100);
y=x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1;
plot(x,y)
Lo que deberia ser una gráfica suave de un polinomio aparece altamente
oscilatoria y de caracter aparentemente aleatorio. Esto se debe a la
cancelación severa de cifras significativas en el cálculo donde
el resultado final es aproximadamente cero y se toman sumas y diferencias
de números del tamaño de
. El polinomio
de este ejemplo corresponde a la forma expandida de (x-1)7 donde
graficamos cerca de x=1. Si cálculamos con la fórmula sin expandir
no ocurre el problema de cancelación de cifras pero claro lo importante
aqui es ilustrar el fenómeno.
En los ejemplos anteriores la perdida de cifras significativas se debe primordialmente al uso de un número finito de cifras en los cálculos numéricos. Queremos estudiar ahora el otro aspecto, esto es, suponiendo que se hace uso de un número infinito de cifras en los cálculos, ¿cómo la función ó fórmula que se usa propaga los errores en los datos iniciales? Estudiaremos esto para funciones de una y dos variables.
Suponga que queremos evaluar una cierta función f (x) en un argumento cuyo valor exacto es xt. Suponga que xa es una aproximación de xt. ¿Cómo comparan f(xt) y f(xa)? Note que implicitamente asumimos que f se puede calcular exactamente dado un argumento y lo que nos interesa es determinar como f propaga el error en xa como aproximación de xt. Usando el Teorema del Valor Medio (cf. Xxx) podemos escribir
para algún c entre xa y xt. Dividiendo por f(xt) en ambos lados podemos obtener la siguiente fórmula para los errores relatívos:
Esta fómula nos indica que el número
actua como un factor de magnificación para el error relativo en xa. K se denomina como el número de condición. Si suponemos que el error absoluto en xa como aproximación de xt es pequeño, podemos aproximar c y xt por xa y tenemos que
(2.4)
Ejemplo 5: Suponga que
y que
xa=0.0025 con un error relatívo de 10-4. Entonces
es una
aproximación del valor exacto f(xt) con un error relativo
de
En este ejemplo hay que tener cuidado porque la aproximación (2.4) del factor de magnificación K, deteriora según nos acercamos a cero.
Si f es una función de dos variables (x,y), entonces el Teorema del Valor Medio nos dice que si f tiene derivadas parciales continuas, existen c y d tal que
el cúal se puede usar para estimar el error al evaluar f en un argumento aproximado.
Ejemplo 6: Queremos cálcular la distancia focal f de un lente usando la fórmula
donde y
. Aqui
xa=32, ya=46 con errores absolutos de
±1mm. Tenemos pues que
correcto a seis cifras. Este cálculo tiene un error absoluto aproximado de
Ahora obtenemos f tomando el reciproco del resultado de arriba para obtener
que tiene un error absoluto aproximado de
Vamos a considerar ahora los efectos en la propagación de errores en las funciones aritméticas de la computadora. Esto es consideramos ambas fuentes de error: el uso de un número finito de cifras en los cálculos y como la función en si propaga los errores en los datos.
Las funciones aritméticas son funciones de dos variables de modo que
denotamos por xa y ya aproximaciones de los valores
exactos xt y yt. Denotamos por
cualquiera
de las operaciones
y por
la operación
aritmética correspondiente según se cálcula en la
computadora. Vamos a suponer que
corresponde
a la operación exacta pero truncada a la presición de la
máquina. Esto es
(2.5)
Queremos estimar el error
Pero podemos escribir
(2.6)
Los dos terminos de la derecha de esta ecuación corresponden a el
error propagado por la operación exacta
debido a los
errores en xa y ya, mientras que el segundo termino
corresponde a el error causado por el uso de la operación aproximada
. Por el Teorema
(2.1) y la hipotesis (2.5) tenemos que
donde esta
acotado por el epsilon de la máquina. De aqui que
De aqui que
de modo que el termino del error en (2.6) por la operación
aritmética aproximada de la computadora es del orden del epsilon de
la máquina. El termino del error propagado en (2.6) es pues el más
significativo y su comportamiento depende de la operación aritmética
en cuestión. Veamos el caso en que
. Escribimos
en lugar de
. Escribimos
Entonces el error propagado se puede expresar como
el cual se puede estimar con los estimados de
y los valores
de xa, ya. Podemos más aún calcular el
error relativo en xaya como sigue:
de donde tenemos que si Rel(xa) y Rel(ya) son pequeños, entonces Rel(xaya) será pequeño y se puede aproximar por
Decimos pues que la multiplicación es una operación estable. En forma similar se demuestra que
obteniendo asi que la división es también una operación estable. Para la suma y la resta la situación es distinta. Es fácil ver que
que es pequeño dado que
lo son. Pero
para el error relativo tenemos que
el cual puede ser bien grande aunque
sean
pequeños si
. Este es el
fenómeno de perdida de cifras significativas que vimos anteriormente.
En esta sección estudiamos el problema de sumar muchos números en la computadora. Como cada suma introduce un error, proporcional al epsilon de la máquina, queremos ver como estos errores se acumulan durante el proceso. El análisis que presentamos generaliza al problema del cálculo de productos interiores.
El problema es pues cálcular la sumatoria
usando aritmética de punto flotante. Definimos pues
Queremos determinar el error S - Sn. Motivados por el Teorema
(2.1) definimos
por
donde tomamos S1=a1. Tenemos ahora:
Teorema (2.2):
Demostración: Procedemos por inducción en el número de terminos en la sumatoria.
Ahora verificamos que el resultado también es cierto para n = m+1. Pero
lo cual es el resultado para n = m+1.
Como los ei's son pequeños, podemos aproximar
Asi que por el resultado del teorema
De aqui que
Asi que si queremos minimizar el error en la sumatoria calculada, debemos ordenar los ai's de modo que
i.e., debemos sumar los núeros más pequeños primero y luego los grandes. Note pues que la suma no es una operación conmutativa en la computadora.
Un análisis similar pero más complicado matemáticamente se puede hacer para el producto interior
Note que en el análisis de arriba no se tomaron en consideración posibles errores en los datos ai's. Estos efectos se pueden incluir también en el análisis. (Ver ejercicio (7)).
en el orden de la siguiente figura (para
Obtenga los estimados de los errores "forward" y "backward" para este cómputo.
donde es el
epsilon de la máquina. (Los terminos
se pueden
descartar).
Observe cualquier diferencia o características particulares en las gráficas. Comente.
Resuelva esta recurrencia en la computadora. Haga una gráfica de k
vs . Explíque
la gráfica.
Suponiendo que
y que r £t, calcule el error