Escolar Documentos
Profissional Documentos
Cultura Documentos
difcil de entender. La aritmtica del punto flotante es no solo computacionalmente poderosa si no matemticamente elegante.
Matlab utiliza la aritmtica del punto flotante, la cual involucra un conjunto finito de nmeros con precisin finita. Esta limitacin conlleva dos dificultades:
los nmeros representados no pueden ser
arbitrariamente grandes (en valor absoluto). debe haber agujeros entre ellos. Esto conduce a los fenmenos de roundoff, underflow, y overflow. Por lo general, es posible utilizar Matlab eficazmente sin preocuparse de estos detalles.
Hace 20 aos, la situacin era ms complicada de lo que es ahora. Cada computadora tena su propio sistema de nmeros en punto flotante (algunos eran binario, otras decimal). Haba incluso una computadora rusa que utiliz aritmtica ternaria. Adems, entre los binarios algunas utilizaron aritmtica de base 2, otras octal o hexadecimal . Y cada una tena una precisin diferente.
En 1985 la IEEE Standards Board y la American National Standards Institute decidieron adoptar para la aritmtica binaria de punto flotante lo que se conoce como ANSI/IEEE 754-1985.
Todas las computadoras diseadas a partir de 1985 usan la aritmtica 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 precisin. Hay un formato de precisin simple que ahorra espacio, pero que no es muy rpida en mquinas modernas. En esta ocasin trataremos con doble precisin.
La mayora de los nmeros punto flotante diferentes de cero son normalizados. Estos pueden expresarse como: x=(1+f)2e
La cantidad f se le llama fraccin o mantisa y a e exponente. La fraccin satisface 0f<1 y debe ser representado en sistema binario usando a lo ms 52 bits. Es decir, 252f es un nmero entero en el intervalo 0 252f < 252 El exponente e es un entero en el intervalo -1022 e 1023 La finitud de f es una limitacin de precisin. La finitud de e es una limitacin en rango. Cualquier nmero que no coincida con uno de los nmeros en punto flotante del sistema IEEE debe ser aproximado por uno de ellos.
Los nmeros en punto flotante de doble precisin se almacenan en palabras de 64 bits, con 52 bits para f, 11 bits para e, y 1 bit para el signo del nmero. El signo de e es almacenando en e + 1023, que est entre 1 y 211-2.
Los dos valores extremos, el 0 y el 211-1 del exponente, son reservados para los nmeros de punto flotante excepcionales que describiremos ms adelante.
La parte fraccional de un nmero en punto flotante no es f, sino 1+f, que necesita 53 bits. Sin embargo, el 1 no necesita ser almacenado. En efecto, el formato de IEEE almacena 65 bits de informacin en una palabra de 64 bits.
El programa floatgui muestra la distribucin de los nmeros positivos en punto flotante en un sistema para el que es posible elegir los parmetros. El parmetro t especifica el nmero de bits usados para almacenar f. En otras palabras, 2 t f es un nmero entero.
Los parmetros emin y emax especifican el rango del exponente as que emin e emax . Inicialmente, floatgui se presenta con t = 3, emin = -4 y emax = 3 y produce la siguiente distribucin (floatgui.m)
Dentro de cada intervalo binario 2e x 2e+1 los nmeros estn igualmente espaciados con un incremento de 2e-t . Si e = 0 y t = 3, por ejemplo, el espacio de los nmeros entre 1 y 2 es 2-3 (1/8); el espacio entre los nmeros 2 y 3 es 2-2 , etc. Mientras que e aumenta , el espacio aumenta.
Los nmeros en punto flotante se pueden exhibir con logscale. El programa muestra floatgui con logscale con t = 5, emin = -4, y emax = 3. Con esta escala logartmica, es ms evidente que la distribucin en cada intervalo binario es igual.
Una importante cantidad asociada con la aritmtica del punto flotante es high-lighted marcada con rojo por floatgui. A este nmero, se le conoce con el nombre de psilon de la mquina y se denota en MATLAB por eps.
eps es la distancia de 1 al siguiente nmero en punto flotante. Para el sistema punto flotante del modelo floatgui, eps = 2^(-t). Antes del formato IEEE, diversas mquinas tenan distintos valores de eps. Ahora, para IEEE de precisin doble, eps = 2^(-52)
EPS
eps/2 o el eps (psilon de la mquina) se puede llamar el nivel del roundoff (Redondeo).
El error relativo mximo se comete cuando el resultado de una operacin aritmtica se redondea al nmero punto-flotante ms cercano, este error es eps /2=2-53.
La distancia o espacio relativo mximo entre los nmeros punto-flotante es eps. En cualquier caso, podemos decir que el nivel del roundoff o de error relativo es cerca de 16 dgitos decimales.
ROUNDOFF
Un caso frecuente del roundoff ocurre con la declaracin simple de Matlab: t = 0.1
El valor matemtico t almacenado en t no es exactamente 0:1 porque la expresin de la fraccin decimal 1/10 en binario requiere de una serie infinita. Dicha serie es:
Despus del primer trmino, la secuencia de los coeficientes 1, 0, 0, 1 se repite infinitamente de manera frecuente. Agrupando estos trminos de 4 en 4, observamos que juntos expresan 1/10 en series de base 16 (HEXADECIMAL):
BINARIO A HEXADECIMAL
1) Agrupe la cantidad binaria en grupos de 4 en 4 iniciando por el lado derecho. Si al terminar de agrupar no completa 4 dgitos, entonces agregue ceros a la izquierda. 2) Posteriormente vea el valor que corresponde de acuerdo a la tabla: Binario Hexadecimal
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 E F
Los nmeros punto-flotante que se encuentran a cualquier lado de 1/10, son obtenidos por la terminacin de la parte fraccionaria de esta serie despus de 52 trminos binarios (o 13 trminos hexadecimales) redondeando el ltimo trmino al entero ms prximo. As tenemos que:
donde:
Resulta que 1/10 est ms prximo a t2 que a t1, as que t es igual al t2. Es decir:
donde:
En realidad, la conversin de nmeros entre las bases 2 y 16 es muy sencilla. Por ejemplo, el comando de MATLAB format hex aplicado a t=0.1 produce:
3fb 999999999999a
3fb 999999999999a
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 fraccin que en binario sera: 1001 1001 1001 1001 1010 ocupando los 52 bits correspondientes.
RESUMEN
El valor almacenado en t es muy cercano, pero no exactamente igual, a 0.1 Algunas veces es importante hacer dicha distincin. Por ejemplo, la cantidad: 0.3/0.1 Esta cantidad no es exactamente igual a 3 porque el numerador real es un poco ms pequeo que el 0.3 y el denominador real es poco ms grande al valor almacenado de 0.1
Visto de otra manera, diez pasos de longitud t (t=0.1) no son precisamente lo mismo que un paso de longitud 1.
Matlab es muy cuidadoso en el arreglo del ltimo elemento del vector: 0: 0.1 :1 para que ste sea exactamente 1. Pero si formamos este vector a travs de repetidas adiciones de 0.1, nos extraar que el final sea exactamente 1.
3ff9e3779b97f4a8
Una vez ms, 3 es el primer dgito hexadecimal, es 0011 en binario. 3ff en base 16 es: 3*162 + 15*16 + 15 = 1023 en decimal, por lo que e=0.
El primer bit es el signo del nmero puntoflotante(0 es positivo y 1 es negativo), pero es positivo. Los bits restantes de los primeros tres dgitos hexadecimales contienen a e + 1023.
En realidad, cualquier numero punto-flotante entre 0.1 y 0.2 tiene e=0, sin embargo estas salidas hexadecimales comienzan con 3ff.
3ff9e3779b97f4a8
Las restantes 13 cifras hexadecimales contienen la fraccin f que en este ejemplo es: f = 9/16 + 14/162 + + 10/1612 + 8/1613
Con esos valores de f y e se obtiene:
(1 + f)2e
El nico redondeo est presente en la divisin, en la primera sentencia. El cociente no puede ser exactamente 4/3 El valor almacenado en a es cercano pero no exactamente igual a 4/3. La substraccin b = a 1 produce una variable b cuyo ltimo bit es 0. La multiplicacin 3*b puede efectuarse sin redondeo. El valor almacenado en c no es exactamente igual a 1, por lo que el valor almacenado en e no es 0.
El nivel de redondeo de eps a veces es llamado floating-point zero, (punto flotante cero) pero es un nombre mal aplicado. Hay muchos nmeros de punto flotante mucho ms pequeos que eps. El nmero de punto flotante ms pequeo positivo tiene f = 0 y e = -1022. El nmero de punto flotante ms grande tiene f un poco menor que 1 y e = 1023. Matlab llama a stos nmeros realmin y realmax. Junto con eps, caracterizan el sistema estndar.
Si cualquier clculo intenta producir un valor ms grande que realmax, se indica overflow (excede el lmite). El resultado es un valor de punto flotante excepcional llamado infinito o Inf. Es representado tomando e = 1024 y f = 0 y satisface relaciones como 1/Inf = 0 e Inf+Inf = Inf. Si cualquier clculo intenta producir un valor indefinido incluso en los reales, el resultado es un valor excepcional conocido como Not-a-Number (no es un nmero), o NaN. (Ej. 0/0, Inf-Inf). NaN es representado tomando e = 1024 y f distinto de cero.
Si cualquier clculo intenta producir un valor ms pequeo que realmin, se indica underflow (por debajo del lmite). Muchas pero no todas las mquinas permiten nmeros de punto flotante excepcionales en el intervalo entre realmin y eps*realmin. El nmero subnormal positivo ms pequeo es alrededor de 0.494e-323. Cualquier resultado ms pequeo que ste se toma como 0. En mquinas sin valores subnormales, cualquier resultado ms pequeo que realmin se toma como 0.
Matlab usa el sistema de punto flotante para manipular enteros. En ocasiones usaremos el trmino flint para describir un nmero punto flotante cuyo valor es un entero. Las operaciones de punto flotante en flints no introduce errores de redondeo, mientras el resultado no sea muy grande. La suma, resta y multiplicacin de flints produce el resultado flint exacto si no es mayor a 253. La divisin y raz cuadrada que involucren flints tambin producen un flint si el resultado es un entero. Por ejemplo, sqrt(363/3) produce 11, sin redondeo.
Dos funciones de MATLAB que desarma ( descompone) y une nmeros de punto flotante son log2 y pow2.
help log2
help pow2
produce
[F,E] = LOG2(X) para un arreglo real X, regresa un arreglo F de nmeros reales, usualmente en el rango 0.5<=abs(F)<1, y un arreglo E de enteros, as que X=F .*2.^E. Cualquier cero en X produce F=0 y E=0. X=POW2(F,E) para un arreglo real F y un arreglo de enteros E calcula X=F .* (2.^E). El resultado es calculado rpidamente simplemente aade E al exponente punto flotante de F.
Las cantidades F y E denotados por log2 y pow2 preceden del IEEE estndar de punto flotante y as notamos que son escasamente diferentes de los f y e que nosotros solemos usar en este tema. De hecho, f = 2*F-1 y e = E-1.
[F,E] = log2(phi) produce F= 0.80901699437495
E=
1
phi = 1.61803398874989 Veamos un ejemplo de cmo un redondeo errneo afecta el clculo matricial, consideremos el conjunto 2 por 2 de ecuaciones lineales
17 x1 5 x2 22 ,
1.7 x1 0.5 x2 2.2.
x= -1.0588 8.0000 De dnde se obtuvo esto? Bien, las ecuaciones son singulares, pero consistentes. La segunda ecuacin solo es 0.1 veces la primera. El calculo para x tiene una infinidad de soluciones posibles. Pero la representacin punto flotante de la matriz A no es exactamente singular porque A(2,1) no es precisamente 17/10.
El proceso de solucin resta un mltiplo de la primera ecuacin de la segunda. El multiplicador es mu=1.7/17, el cual resulta ser el nmero punto flotante obtenido por truncar, en vez de redondear, la expansin binaria de 1/10. La matriz A y el lado derecho b son modificados ahora por A(2,:) = A(2,:) mu*A(1,:) b(2) = b(2) mu*b(1) Con el calculo preciso , ambos A(2,2) y b(2) seran cero, pero con la aritmtica de punto flotante, ambos no llegan a ser mltiplos ceros de eps.
Este valor es sustituido en la primera ecuacin anteriormente vista para dar x(1) = (22 5*x(2))/17 = -1.0588 Los detalles de un redondeo errneo conduce a MATLAB a escoger una solucin particular de entre muchas infinidades de soluciones posibles para el sistema singular.
de nmeros tan grandes como 35 1.0124. No es grave la cancelacin sustrada. El ejemplo fue conseguido usando la caja de herramientas simblicas para expandir ( x 1) 7 y escogiendo cuidadosamente el rango para el eje x tan cercanos a x = 1. Si los valores de y son calculados a la vez por y ( x 1). ^7; entonces resulta una grfica suave (pero muy plana).