Instituto de Matemática - UFRGS - Mat01099 - Seminário Integrador III

Objetivo: no contexto de aritmética de máquina (sobre um sistema ponto-flutuante generalizado FL(B,p,L,U)) e suas limitações, apresentar situações onde fenômenos indesejáveis podem ser evitados com boas práticas de programação.

(A) - Overflow

Ocorre quando a computação gera um número $x$ que necessitaria ter expoente $E$ MAIOR do que o máximo permitido $U$ para ser representado na forma normalizada. A computação PARA, e mensagem de erro segue-se. Exemplo, em Scilab, para avaliar $z = \sqrt{x^2 + y^2}$ para $x=10^{200}$, $y=10^{198}$:

--> x=10**(200); y=10**(198); z = sqrt(x*x + y*y)

Overflow evitável (benfeitoria)

Para qualquer $n$ inteiro, avaliamos $z = \sqrt{x_1^2 + x_2^2 + \dots +
x_n^2}$ via

$\displaystyle \left\{ \begin{array}{rr}
m = \max\{\vert x_1\vert, \vert x_2\ver...
... +
\dots +
\left(\frac{x_n}{m} \right)^2 } & \mbox{ c.c }
\end{array} \right. $

Experimente, em Scilab :

--> x=10**(200); y=10**(198); m=max(abs(x),abs(y))
--> z = m*sqrt( (x/m)**2 + (y/m)**2)

(B) - Underflow

Ocorre quando a computação gera um número $x$ que necessitaria ter expoente $E$ MENOR do que o mínimo permitido $L$ para ser representado na forma normalizada. A computação pode prosseguir, pois o número é substituído por ZERO. Exemplo, em Scilab, para avaliar $z = \sqrt{x^2 + y^2}$ para $x=10^{-200}$, $y=10^{-198}$:

--> x=10**(-200); y=10**(-198); z = sqrt(x*x + y*y)

Underflow evitável (benfeitoria)

Para qualquer $n$ inteiro, avaliamos $z = \sqrt{x_1^2 + x_2^2 + \dots +
x_n^2}$ usando a mesma benfeitoria do caso (A):

$\displaystyle \left\{ \begin{array}{rr}
m = \max\{\vert x_1\vert, \vert x_2\ver...
... +
\dots +
\left(\frac{x_n}{m} \right)^2 } & \mbox{ c.c }
\end{array} \right. $

Experimente, em Scilab :

--> x=10**(-200); y=10**(-198); m=max(abs(x),abs(y))
--> z = m*sqrt( (x/m)**2 + (y/m)**2)

(C) - Subtração catastrófica

Ocorre quando a soma de dois números (em aritmética ponto-flutuante) resulta na subtração de duas quantidades muito próximas uma da outra. Nessa situação, os alguns dos algaritmos de mantissa que estão corretos (nos dois números) vão se cancelar, de maneira que, na resposta (próxima de zero) algarismos não corretos ganham posições mais importantes.

Exemplo: ao avaliarmos $y = \sqrt{1+e^{-x}}-1$ para valores de $x$ com magnitude cada vez maior, perda de exatidão é esperada. Mostre que a expressão $\displaystyle z = \frac{e^{-x}}{\sqrt{1+e^{-x}}+1}$ é equivalente a de $y$, e preencha a tabela abaixo (use notação científica),

$x$ $y$ $z$
$3^{0}$ 1.6956378242978D-01 1.6956378242978D-01
$3^{1}$    
$3^{2}$    
$3^{3}$    
$3^{4}$    
$3^{5}$    
em Scilab use
-->format("e",20)
-->x=1;y=sqrt(1+exp(-x))-1;z=exp(-x)/(sqrt(1+exp(-x))+1);[x y z]
-->x=3*x;y=sqrt(1+exp(-x))-1;z=exp(-x)/(sqrt(1+exp(-x))+1);[x y z]

Exemplo: Em vistas ao problema de perda de exatidão por subtração catastrófica, é sabido que tal problema existe na avaliação da Fórmula de Báskara

$\displaystyle x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} $,

no cálculo da raíz de menor magnitude, quando o produto $ac$ é próximo de zero, e então $\displaystyle \sqrt{b^2-4ac} \approx \vert b\vert$. Por outro lado, sabida benfeitoria usa a propriedade que o produto das raízes $x_1$ e $x_2$ satisfaz $x_1 x_2 = c/a$, e determina

$ \begin{array}{ll}
\displaystyle x_{1} = \frac{-b - sgn(b) \sqrt{b^2 - 4ac}}{2a} , &
\displaystyle x_2 = \frac{c}{a x_1} .
\end{array} $

PEDE-SE: em Scilab, encontre, com máxima exatidão, as raízes de $a x^2 + b x + c = 0$, onde $a=10^{-8}$, $b=1$, $c=10^{-9}$.



Joao Batista Carvalho 2014-03-21