Página web del curso

Ejercicio

  1. Representar 0,3 en precisión simple. Redondear al par más cercano.
  2. Dar el error absoluto y relativo en base 10. Comprobar que el error relativo es menor que el épsilon de máquina.

Representar 0,3 en precisión simple. Redondear al par más cercano.

Paso del sistema decimal a binario

Este número no tiene parte entera, solo parte fraccionaria. Para convertirla a base $2$ multiplicamos por $2$, restamos la parte entera, que guardamos porque van a ser nuestros dígitos binarios, y repetimos.

$$\begin{array}{lccccccc} 0,3 &\times& 2 &= &0,6 &\rightarrow & 0 & \downarrow\\ \hline 0,6&\times& 2& = &1,2 &\rightarrow & 1& \downarrow\\ 0,2&\times& 2& = &0,4&\rightarrow & 0& \downarrow\\ 0,4&\times& 2& = &0,8&\rightarrow & 0& \downarrow\\ 0,8&\times& 2& = &1,6&\rightarrow & 1& \downarrow\\ \hline 0,6&\times& 2& = &1,2 &\rightarrow & 1& \downarrow\\ 0,2&\times& 2& = &0,4&\rightarrow & 0& \downarrow\\ 0,4&\times& 2& = &0,8&\rightarrow & 0& \downarrow\\ 0,8&\times& 2& = &1,6&\rightarrow & 1& \downarrow\\ \hline \vdots & & & &\vdots & & \vdots & \end{array}$$

En este caso, podemos seguir obteniendo dígitos hasta el infinito. Es un número binario con parte fraccionaria periódica. Guardamos los dígitos empezando por el de arriba

$$(0,3)_{10} = (\mathtt{0,0\,1001\,1001\,1001\,1001\,1001\,1001\,1001\ldots})_2$$

Normalización

  1. Movemos la coma de forma que aparezca un único dígito distinto de cero a su izquierda.
  2. Al mover la coma tenemos que multiplicar por $2^n$ siendo $n$ el número de posiciones que hemos movido la coma a la izquierda o $2^{-n}$ siendo $n$ el número de posiciones que hemos movido la coma a la derecha.
  3. Le añadimos el signo.

Este número normalizado sería

$$+\mathtt{1,001\,1001\,1001\,1001\,1001\,1001\,1001\ldots}\times2^{-2}$$

Signo

Como el signo es positivo $\longrightarrow$ signo $\mathtt{0}$

Exponente

Tenemos $m=8$ bits para el exponente. Por lo tanto hay $2^m = 2^8 = 256$ combinaciones distinta y, en principio, podemos representar $256$ números. Como empezamos el valor nominal empieza en $0$ acabará en $255$. El primer número, $\mathtt{0000\,0000}$, y el último, $\mathtt{1111\,1111}$ se reservan (ya veremos luego para qué). Y como la representación es sesgada, tenemos que restar el $$sesgo=2^{m-1}-1 = 128-1 = 127$$ para obtener el valor representado.

El valor del exponente es $-2$. Para obtener el valor nominal tenemos que sumarle el sesgo y $-2+127=125$ que en binario sería

$$ \begin{array}{cccc} \hline \mathrm{Dividendo} & \mathrm{Divisor} & \mathrm{Cociente} & \mathrm{Resto}&\\ \hline 125 & 2 & 62 & 1 & \uparrow \\ 62 & 2 & 31 & 0 & \uparrow \\ 31 & 2 & 15 & 1 & \uparrow \\ 15 & 2 & 7 & 1 & \uparrow \\ 7 & 2 & 3 & 1 & \uparrow \\ 3 & 2 & 1 & 1 & \uparrow \\ 1 & 2 & 0 & 1 & \uparrow \\ \hline \end{array} $$

es decir

$$(125)_{10} = (\mathtt{111\,1101})_2$$
$$ \begin{array}{cccc} \hline \mathrm{Número}\; \mathrm{binario} & \mathrm{Valor}\; \mathrm{nominal} & & \mathrm{Valor}\; \mathrm{representado}\\ \hline \mathtt{0000\,0000}& 0& & R\\ \mathtt{0000\,0001}& 1& & -126\\ \mathtt{0000\,0010}& 2& & -125\\ \mathtt{0000\,0011}& 3& & -124\\ \cdots & \cdots & -127 & \cdots\\ \cdots & \cdots & \longrightarrow & \cdots\\ \mathtt{{\color{red}{0111\,1101}}}& {\color{red}{125}}& & {\color{red}{-2}}\\ \cdots & \cdots & +127 & \cdots\\ \cdots & \cdots & \longleftarrow & \cdots\\ \mathtt{1111\,1100}& 252 & & 126 \\ \mathtt{1111\,1101}& 253 & & 126 \\ \mathtt{1111\,1110}& 254 & & 127 \\ \mathtt{1111\,1111}& 255 & & R\\ \hline \end{array} $$

Mantisa

$$(0,3)_{10}$$

La mantisa es $$\mathtt{1,{\color{ForestGreen}{001\,1001\,1001\,1001\,1001\,1001}\,{\color{red}{1001}\ldots}}}.$$ Hemos de tener en cuenta el bit escondido, que no almacenamos.

Los dígitos $\mathtt{{\color{red}{1001}\ldots}}$ no los vamos a almacenar, pero tenemos que tenerlos en cuenta para redondear el número.

El método de redondeo será al núméro par más cercano.

  • Truncamiento: Le quitamos los últimos dígitos para dejar el número de dígitos en 24 $$\mathtt{1,{001\,\color{ForestGreen}{1001\,1001\,1001\,1001}\,1001}}$$
  • Redondeo: Tomamos el siguiente número en esta precisión que es $$ \begin{array}{rll} & \mathtt{1,{001\,\color{ForestGreen}{1001\,1001\,1001\,1001}\,1001}} \\[-40pt] +&\\[-50pt] & \mathtt{0,{000\,\color{ForestGreen}{0000\,0000\,0000\,0000}\,0001}} \\[-40pt] \hline & \mathtt{1,001\,{\color{ForestGreen}{1001\,1001\,1001\,1001}\,1010}} \\[-40pt] \end{array} $$ Tomamos el punto medio entre los dos que es $$\mathtt{{\color{red}{1,001}}{\color{ForestGreen}{\,1001\,1001\,1001\,1001}\,{\color{red}{1001\,1}}}}$$ Como el número que queremos redondear es mayor que este punto medio, redondea hacia arriba, a $$\mathtt{1,001\,{\color{ForestGreen}{1001\,1001\,1001\,1001}\,1010}}$$

Almacenamos 23 dígitos. El uno a la izquierda de la coma no se almacena. Es el bit escondido.

Número

El número $0,3$ en precisión sencilla se almacena

$$ \begin{array}{|c|c|c|} \hline \mathtt{signo}&\mathtt{exponente}&\mathtt{mantisa}\\ \hline \mathtt{0}&\mathtt{0111\,1101}&\mathtt{001\,1001\,1001\,1001\,1001\,1010}\\ \hline \end{array} $$

Error absoluto y relativo en base 10.

El número almacenado es

$$\mathtt{1,001\,1001\,1001\,1001\,1001\,1010}\times 2^{-2}$$

Que en base 10 es

$$\left(1+2^{-3}+2^{-4}+2^{-7}+2^{-8}+2^{-11}+2^{-12}+2^{-15}+2^{-16}+2^{-19}+2^{-20}+2^{-22}\right)\times 2^{-2}$$

Operando, este número es

$$x^* = 0,30000001192092896$$

Y como $x = 0,3$

  • Error absoluto $$e_a=|x-x^*|=0,00000001192092896\approx 1,2\times10^{-8}$$
  • Error relativo $$e_r=\frac{e_a}{|x|}\approx 4 \times10^{-8}$$

Y habíamos dicho que este número tenía que ser menor que el épsilon de máquina. Como para precisión simple el épsilon de máquina es

$$\epsilon = 2^{-23}\approx 1,2 \times 10^{-7}$$

tenemos que

$$e_r = 4\times 10^{-8}\lt 12 \times 10^{-8}= 1,2 \times 10^{-7} = \epsilon$$