Detalles de Matlab

Anuncio
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
Detalles de Matlab
MATLAB utiliza la aritmética del punto flotante, la cual involucra un conjunto finito de números con precisión finita.
Esta limitación conlleva dos dificultades:
los números representados no pueden ser arbitrariamente grandes (en valor absoluto).
debe haber “agujeros” entre ellos.
Esto conduce a los fenómenos de roundoff, underflow, y overflow. Por lo general, es posible utilizar MATLAB
eficazmente sin preocuparse de estos detalles.
Hace 20 años, la situación era más complicada de lo que es ahora. Cada computadora tenía su propio sistema de
números en punto flotante (algunos eran binario, otras decimal).
Había incluso una computadora rusa que utilizó aritmética ternaria. Además, entre los binarios algunas utilizaron
aritmética de base 2, otras, octal o hexadecimal. Y cada una tenía una precisión diferente.
En 1985 la IEEE Standards Board y la American National Standards Institute decidieron adoptar para la aritmética
binaria de punto flotante lo que se conoce como ANSI/IEEE 754-1985.
Todas las computadoras diseñadas a partir de 1985 usan la aritmética 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 precisión. Hay un formato de precisión simple que ahorra
espacio, pero que no es muy rápida en máquinas modernas. En esta ocasión trataremos con doble precisión.
La mayoría de los números punto flotante diferentes de cero son normalizados. Estos pueden expresarse como:
x=±(1+f)·2
e
La cantidad f se le llama fracción o mantisa y a e exponente. La fracción satisface:
0≤f<1
52
y debe ser representado en sistema binario usando a lo más 52 bits. Es decir, 2 f es un número entero en el intervalo:
52
0≤2 f<2
52
El exponente e es un entero en el intervalo
-1022 ≤ e ≤ 1023
La finitud de f es una limitación de precisión. La finitud de e es una limitación en rango. Cualquier número que no
coincida con uno de los números en punto flotante del sistema IEEE debe ser aproximado por uno de ellos.
Los números en punto flotante de doble precisión se almacenan en “palabras” de 64 bits, con 52 bits para f, 11 bits
11
para e, y 1 bit para el signo del número. El signo de e es almacenando en e + 1023, que está entre 1 y 2 -2.
11
Los dos valores extremos, el 0 y el 2 -1 del exponente, son reservados para los números de punto flotante
excepcionales que describiremos más adelante.
1
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
e
2010
e+1
e-t
Dentro de cada intervalo binario 2 ≤ x ≤ 2 los números están igualmente espaciados con un incremento de 2 . Si e
-3
-2
= 0 y t = 3, por ejemplo, el espacio de los números entre 1 y 2 es 2 (1/8); el espacio entre los números 2 y 3 es 2 ,
etc. Mientras que e aumenta, el espacio aumenta.
eps es la distancia de 1 al siguiente número en punto flotante.
Antes del formato IEEE, diversas máquinas tenían distintos valores de eps. Ahora, para IEEE de precisión doble,
eps = 2^(-52)
- 16
El valor decimal aproximado del “eps” es: 2.2204x10
eps/2 o el eps (épsilon de la máquina) se puede llamar el nivel del roundoff (Redondeo).
El error relativo máximo se comete cuando el resultado de una operación aritmética se redondea al número
-53
punto-flotante más cercano, este error es eps /2=2 .
La distancia o espacio relativo máximo entre los números punto-flotante es “eps”. En cualquier caso, podemos decir
que el nivel del roundoff o de error relativo es cerca de 16 dígitos decimales
Un caso frecuente del roundoff ocurre con la declaración simple de MATLAB:
t = 0.1
El valor matemático t almacenado en “t” no es exactamente 0,1 porque la expresión de la fracción decimal 1/10 en
binario requiere de una serie infinita. Dicha serie es:
En realidad, la conversión de números 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 números 10 a 15 en forma hexadecimal.
Los primeros tres caracteres, 3fb, nos dan la representación hexadecimal del decimal 1019, que es el valor
del exponente en polarización negativa e+1023 si “e” es -4.
Los otros 13 caracteres son la representación hexadecimal de la fracción “f” o mantisa.
El valor almacenado en “t” es muy cercano, pero no exactamente igual, a 0.1
Algunas veces es importante hacer dicha distinción. Por ejemplo, la cantidad:
0.3/0.1
2
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
Esta cantidad no es exactamente igual a 3 porque el numerador real es un poco más pequeño que el 0.3 y el
denominador real es poco más grande al valor almacenado de 0.1
0.1 (10)=3fb999999999999a(16)
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 fracción que en binario sería:
1001 1001 1001 · · · 1001 1010 ocupando los 52 bits correspondientes.
Esto lo probamos haciendo 0.3/0.1 == 3 y obtenemos falso
También podemos hacer (0.1 +0.1+0.1) -0.3 y no nos da 0
Representación de datos en Matlab
Matlab utiliza aritmética de doble precisión y permite visualizar y representar números en diferentes bases con
comandos simples
Ejemplos:
>>bin2dec(‘11011011’)
Esta orden convierte a decimal el binario que se pasa como parámetro
>>dec2bin(23)
Convierte a binario el número entero que se pasa como parámetro
>>dec2hex(1023)
Convierte el parámetro a hexadecimal
>>hex2dec(‘3ff’)
Convierte a decimal el hexa que se pasa como parámetro
>>hex2num(‘3fb 999999999999a’)Convierte según formato IEEE el parámetro a decimal
Convierte según formato IEEE el parámetro a hexa
>>num2hex(0.1)
Ejemplos con error en representación
(0.1 + 0.1 + 0.1) – 0.3
5.551115123125783e-017
La siguiente secuencia:
a = 4/3
b = a – 1
0.33333333333333
1.33333333333333
3
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
c = 3*b 1.00000000000000
d=1–c
2.220446049250313e-016
2010
y no cero, como debería ser
Formatos de Salida
Respecto a los formatos numéricos con que MATLAB muestra los resultados (recuérdese que siempre calcula y
almacena con doble precisión, es decir con unas 16 cifras decimales equivalentes), las posibilidades existentes se
muestran en la lista desplegable de la Figura 21 y son las siguientes:
short
coma fija con 4 decimales (defecto)
long
coma fija con 15 decimales
hex
cifras hexadecimales
bank
números con dos cifras decimales
short e
notación científica con 4 decimales
short g
notación científica o decimal, dependiendo del valor
long e
notación científica con 15 decimales
long g
notación científica o decimal, dependiendo del valor
rat
expresa los números racionales como cocientes de enteros
Estos formatos se pueden cambiar también desde la línea de comandos anteponiendo la palabra format. Por
ejemplo, para ver las matrices en formato long habrá que ejecutar el comando:
>> format long
MATLAB mantiene una forma especial para los números muy grandes (más grandes que los que es capaz de
representar), que son considerados como infinito. Por ejemplo, obsérvese cómo responde el programa al ejecutar el
siguiente comando:
>> 1.0/0.0
Warning: Divide by zero
ans =
Inf
Así pues, para MATLAB el infinito se representa como inf ó Inf. MATLAB tiene también una representación especial
para los resultados que no están definidos como números. Por ejemplo, ejecútense los siguientes comandos y
obsérvense las respuestas obtenidas:
4
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
>> 0/0
Warning: Divide by zero
ans =
NaN
>> inf/inf
ans =
NaN
En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de respuesta, así como la de
Inf, son enormemente importantes en MATLAB, pues permiten controlar la fiabilidad de los resultados de los cálculos
matriciales. Los NaN se propagan al realizar con ellos cualquier operación aritmética, en el sentido de que, por
ejemplo, cualquier número sumado a un NaN da otro NaN. MATLAB tiene esto en cuenta. Algo parecido sucede con
los Inf. MATLAB dispone de tres funciones útiles relacionadas con las operaciones de coma flotante. Estas funciones,
que no tienen argumentos, son las siguientes:
eps
devuelve la diferencia entre 1.0 y el número de coma flotante inmediatamente superior. Da una
idea de la precisión o número de cifras almacenadas. En un PC, eps vale 2.2204e-016.
realmin
devuelve el número más pequeño con que se puede trabajar (2.2251e-308)
realmax
devuelve el número más grande con que se puede trabajar (1.7977e+308)
Si cualquier cálculo intenta producir un valor más grande que realmax, se indica overflow (excede el límite). El
resultado es un valor de punto flotante excepcional llamado infinito o Inf. Es representa-do tomando e = 1024 y f = 0 y
satisface relaciones como 1/Inf = 0 e Inf+Inf = Inf.
Si cualquier cálculo intenta producir un valor indefinido incluso en los reales, el resultado es un valor excepcional
conocido como Not-a-Number (no es un número), o NaN. (Ej. 0/0, Inf-Inf). NaN es representado tomando e = 1024 y f
distinto de cero.
Si cualquier cálculo intenta producir un valor más pequeño que realmin, se indica underflow (por debajo del límite).
Muchas pero no todas las máquinas permiten números de punto flotante excepcionales en el intervalo entre realmin y
eps*realmin. El número subnormal positivo más pequeño es alrededor de 0.494e-323. Cualquier resultado más
pequeño que éste se toma como 0. En máquinas sin valores subnormales, cualquier resultado más pequeño que
realmin se toma como 0.
Errores
Sea x un número no representable por su largo excesivo y fl(x) su representación de punto flotante de largo adecuado,
entonces, el error cometido por fl(x) será:
•
Por redondeo:
•
Por truncamiento:
1-t
A la cantidad β , se le denomina épsilon de la máquina.
Los errores numéricos se generan con el uso de aproximaciones para representar las operaciones y cantidades
matemáticas. La relación entre el resultado exacto o verdadero y el aproximado está dada por:
5
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
Valor verdadero = aproximación + error
De lo anterior se concluye que el error numérico resulta de la diferencia entre el valor verdadero y la aproximación,
Ev = valor verdadero – aproximación
Ev : Valor “exacto” o “verdadero” del error.
Ejercicios
1) Un modo de conocer la precisión de un computador es escribir un programa que en cada iteración de un bucle
realice la suma e incrementar k en una unidad, de modo que cuando la suma sea igual a 1.0 el bucle pare. Que la
suma sea igual a 1.0 significa que hemos excedido la precisión del computador. Entonces k-1 es el número de bits de
la mantisa y es la precisión o error de redondeo unitario del computador. Escribir un programa MATLAB que realice
este proceso para deducir la precisión del computador
Resolución:
k=1;
suma=1.0;
while (suma + 2^(-k)) ~= suma
k=k+1;
end;
k-1
%bits de mantisa = 52
2^(-k+1)
%es eps!!!
2) Hallar el epsilon de la máquina para el sistema de punto flotante IEEE de doble precisión
beta = 2; eps1 = 1.0; y = 2.0;
while(y > 1.0)
eps1 = eps1/ beta;
y = 1.0+eps1;
end
eps1*beta
% eps calculado
eps
% eps de la máquina
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
cifras. Ahora calculamos
correctos a seis
. El valor exacto a seis cifras de f(100) es
de modo que perdimos tres cifras en el computo. ¿Cuál fue 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:
6
Descargar