next up previous
Next: 3.4 Desbordamiento por exceso Up: 3.3 Aritmética de punto Previous: 3.3.1 Números de máquina

3.3.2 Las operaciones básicas

Vamos a analizar el resultado de operar sobre dos números en punto flotante normalizado de l-dígitos de longitud, x e y, que producen un resultado normalizado de l-dígitos. Expresaremos esta operación como:

\begin{displaymath}fl(x\; op\; y)
\end{displaymath}

en donde op es +, -, $\times$ ó $\div$. Supondremos que en cada caso la mantisa del resultado es primero normalizada y después redondeada (operación que puede dar lugar a un desbordamiento que requeriría renormalizar el número). El valor de la mantisa redondeada a p bits, qr, se define como (de una forma más rigurosa que en el caso anterior):

\begin{displaymath}q_{r} = \left\{
\begin{array}{ll}
2^{-p} \lfloor 2^{p} q + ...
... 2^{p} q - \frac{1}{2} \rceil & q < 0 \\
\end{array} \right.
\end{displaymath}

en donde la función redondeo por defecto $\lfloor x
\rfloor$ es el mayor entero menor o igual a x y la función redondeo por exceso $\lceil x \rceil$ es el menor entero mayor o igual a x. Para números enteros, esta función se traduce en la bien conocida regla de sumar 1 en la posición p + 1. Teniendo en cuenta sólo la mantisa, redondear de este modo da lugar a un intervalo máximo del error de:

 \begin{displaymath}
\vert \varepsilon_{a} \vert \leq 2^{-p-1}
\end{displaymath} (21)

y un error relativo máximo en el intervalo:

 \begin{displaymath}
\vert \varepsilon_{r} \vert \leq \frac{2^{-p-1}}{1/2} = 2^{-p}
\end{displaymath} (22)

Analizaremos ahora el error generado por cada una de las operaciones básicas:

Multiplicación.
La operación de multiplicar dos números expresados en punto flotante implica sumar los exponentes y multiplicar las mantisas. Si la mantisa resultante no está normalizada, se recurre a renormalizar el resultado ajustando adecuadamente el exponente. Después, es necesario redondear la mantisa a p bits. Para analizar el error de esta operación supongamos dos números:

\begin{displaymath}\begin{array}{ll}
x = q_{x} 2^{f_{x}}; & y = q_{y} 2^{f_{y}}
\end{array} \end{displaymath}

Tenemos entonces que el producto será:

xy = qx qy 2fx + fy

en donde el valor de la mantisa se encontrará en el rango:

\begin{displaymath}\frac{1}{4} \leq \vert q_{x} q_{y} \vert < 1
\end{displaymath}

ya que tanto x como y satisfacen la ecuación (19). Por tanto, la normalización del producto qx qy implica un desplazamiento a la derecha de, como máximo, una posición. La mantisa redondeada será entonces uno de estos dos posibles valores:

\begin{displaymath}\begin{array}{lll}
x = q_{x} q_{y} + \varepsilon & \mathrm{\acute{o}} & x = 2 q_{x}
q_{y} + \varepsilon
\end{array} \end{displaymath}

en donde $\varepsilon$, que es el error de redondeo, cumple la ecuación (21). Tenemos entonces:

\begin{eqnarray*}fl(x\;\times\;y) & = & \left\{
\begin{array}{lr}
(q_{x}q_{y} ...
...c{1}{4}
\end{array} \right. \\
& = & xy(1 + \varepsilon_{q})
\end{eqnarray*}


en donde, de acuerdo con la ecuación (22), tenemos:

\begin{displaymath}\vert \varepsilon_{q} \vert \leq 2 \vert \varepsilon \vert \leq 2^{-p}
\end{displaymath}

Por tanto, la cota del error relativo en la multiplicación es la misma que la que surge por redondear la mantisa.

División.
Para llevar a cabo la división en punto flotante, se divide la mitad de la mantisa del numerador por la mantisa del denominador (para evitar cocientes mayores de la unidad), mientras que los exponentes se restan. Esto es:

\begin{displaymath}\frac{x}{y} = \frac{q_{x}/2}{q_{y}} 2^{f_{x} - f_{y} + 1}
\end{displaymath}

Puesto que ambas mantisas satisfacen la ecuación (18), el valor del cociente estará acotado entre los límites:

\begin{displaymath}\frac{1}{4} \leq \vert \frac{q_{x}}{2q_{y}} \vert < 1
\end{displaymath}

Aplicando un análisis similar al empleado en el caso de la multiplicación, obtenemos:

\begin{eqnarray*}fl(x\; /\; y ) & = & \left\{
\begin{array}{lr}
(q_{x}/2q_{y} ...
...\end{array} \right. \\
& = & \frac{x}{y}(1 + \varepsilon_{d})
\end{eqnarray*}


en donde, de acuerdo con la ecuación (22), tenemos:

\begin{displaymath}\vert \varepsilon_{d} \vert \leq 2 \vert \varepsilon \vert \leq 2^{-p}
\end{displaymath}

Es decir, la cota máxima del error relativo en la división, como en el caso anterior, es la misma que la que surge por redondear la mantisa.

Adición y sustracción.
La operación de suma o resta se realiza del siguiente modo: se toma la mantisa del operando de menor magnitud (supongamos que es y) y se desplaza fx - fy posiciones a la derecha. La mantisa resultante es sumada (o restada) y el resultado se normaliza y después se redondea. Es decir:

\begin{displaymath}x \pm y = (q_{x} \pm q_{y} 2^{f_{y}-f_{x}}) 2^{f_{x}}
\end{displaymath}

El análisis del error cometido en esta operación es más complejo que los estudiados hasta ahora, por lo que no lo vamos a ver en detalle. Sin embargo, el resultado final indica que la cota máxima del error cometido en la adición y la sustracción viene dado por:

\begin{displaymath}\vert \varepsilon_{a} \vert \leq 2 \vert \varepsilon\vert \leq 2^{-p}
\end{displaymath}

En conclusión, en todas las operaciones aritméticas elementales en punto flotante, el error absoluto del resultado es no mayor de 1 en el bit menos significativo de la mantisa.

Sin embargo, los errores de redondeo se acumulan a medida que aumenta el número de cálculos. Si en el proceso de calcular un valor se llevan a cabo N operaciones aritméticas es posible obtener, en el mejor de los casos, un error de redondeo total del orden de $\sqrt{N}
\epsilon_{m}$4 (que coincide con el caso en que los errores de redondeo están aleatoriamente distribuidos, por lo que se produce una cancelación parcial). Desafortunadamente, este error puede crecer muy rápidamente por dos motivos:

Veamos con un ejemplo los problemas comentados anteriormente. Hay dos formas de calcular las soluciones de la familiar ecuación cuadrática:

ax2 + bx + c = 0

que son:

 \begin{displaymath}
x = \frac{-b \pm \sqrt{b^{2} -4ac}}{2a}
\end{displaymath} (23)


 \begin{displaymath}
x = \frac{2c}{-b \pm \sqrt{b^{2} - 4ac}}
\end{displaymath} (24)

Cualquiera de estas dos expresiones da problemas cuando a, c o ambos, son pequeños. En estos casos, el valor del discriminante es muy próximo al valor de b:

\begin{displaymath}\sqrt{b^{2} - 4ac} \approx b
\end{displaymath}

por lo que la diferencia $(\vert b\vert - \sqrt{b^{2} -4ac})$ viene afectada de un error de redondeo importante. En efecto, la ecuación (23) evalúa bien la raíz más grande en valor absoluto, pero da pésimos resultados al estimar la raíz menor en valor absoluto. Por otra parte, la ecuación (24) calcula bien la raíz menor (siempre en valor absoluto) pero no la raíz más grande.

La solución del problema pasa por emplear una expresión mejor condicionada. En este caso, es preferible calcular previamente:

 \begin{displaymath}
q = -\frac{1}{2} \left[b + \mathrm{sign}(b) \sqrt{b^{2} - 4ac}
\right]
\end{displaymath} (25)

y las dos raíces a partir de valor de q como:

 \begin{displaymath}
\begin{array}{lll}
x_{1} = \frac{q}{a} & \mathrm{y} & x_{2} = \frac{c}{q}
\end{array}\end{displaymath} (26)

Ejemplo: Calcular las raíces de la siguiente ecuación cuadrática:

ax2 + bx + c = 0

siendo:

\begin{displaymath}\begin{array}{lll}
a = 1.0; & b = 1.343 \cdot 10^{5}; & 3.764 \cdot 10^{-6}
\end{array}\end{displaymath}

Solución: Empleando la ecuación (23), obtenemos:

\begin{eqnarray*}x_{1} & = & \underline{-0.13430 \cdot 10^{5}} \\
x_{2} & = & 0.44676 \cdot 10^{-3}
\end{eqnarray*}


Sin embargo, empleando la expresión (24):

\begin{eqnarray*}x_{1} & = & \infty \; \; \; \mathit{(overflow)} \\
x_{2} & = & \underline{-0.28027 \cdot 10^{-10}}
\end{eqnarray*}


Por último, empleando las expresiones (25) y (26) se obtienen ambas soluciones correctas:

\begin{eqnarray*}x_{1} & = & \underline{-0.13430 \cdot 10^{5}} \\
x_{2} & = & \underline{-0.28027 \cdot 10^{-10}}
\end{eqnarray*}



next up previous
Next: 3.4 Desbordamiento por exceso Up: 3.3 Aritmética de punto Previous: 3.3.1 Números de máquina
Wladimiro Diaz Villanueva
1998-05-11