Está en la página 1de 45

ARITMETICA DEL PUNTO FLOTANTE

Mario Alberto Mayra Lucia Elizabeth Carlos

Intentaremos convencerte que las siguientes afirmaciones son falsas:


El anlisis numrico es el estudio de la aritmtica

del punto flotante.


La aritmtica del punto flotante es impredecible y

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

El valor decimal aproximado del eps es: 2.2204x10 - 16

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:

>> 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 nmeros 10 a 15 en forma hexadecimal.


Los primeros tres caracteres, 3fb, nos dan la representacin hexadecimal del decimal 1019, que es el valor del exponente en polarizacin negativa e+1023 si e es -4. Los otros 13 caracteres son la representacin hexadecimal de la fraccin f o mantisa.

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.

En qu se parece la aproximacin del Punto Flotante al Radio dorado?

El siguiente cdigo nos da la razn urea en base 16:

>>format hex >>phi = (1 +sqrt (5))/2 phi= 3ff9e3779b97f4a8

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 siguiente fragmento de cdigo muestra otro ejemplo:


Format long a = 4/3 b = a 1 c = 3*b e = 1 c Con un clculo exacto, e debera ser 0. Pero con el punto flotante, la salida producida es:

a = 1.33333333333333 b = 0.33333333333333 c = 1.00000000000000 e = 2.220446049250313e-016

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.

Binary eps realmin realmax 2^(-52) 2^(-1022) (2-eps)*2^1023

Decimal 2.2204e-16 2.2251e-308 1.7977e+308

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

Entonces phi = pow2(F,E) devuelve

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.

La solucin obvia es x1 1, x2 1. Pero las declaraciones de MATLAB


A = [17 5; 1.7 0.5] b = [22; 2.2] x = A\b producen

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.

A(2,2) = (1/4)*eps = 5.5511e-17 b(2) = 2*eps = 4.4408e-16


MATLAB anuncia el nuevo pequeo valor de A(2,2) y muestra un mensaje de advertencia de que la matriz se acerca a singular. Entonces, este calcula la solucin de la segunda ecuacin modificada por dividir un redondeo errneo por otro. x(2) = b(2)/A(2,2) =8

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.

Nuestro ejemplo final grafica un polinomio de sptimo grado.


x = 0.988:.0001:1.012; y = x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1; El resultado en la grfica no parece ser un polinomio. sta no es suave. Estamos tratando con un redondeo errneo. El factor escala del eje y es pequeo,10 14.Los valores pequeos de y se han calculado para tomar sumas y restas

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).

C. MOLER, Floating-Point Arithmetic, Numerical Computing with MATLAB, pp 34-42. http://www.mathworks.com/moler/