Página web del curso

Introducción

La norma IEEE 754

El formato en coma usado habitualmente es el formato IEEE 754. IEEE significa Institute of Electrical and Electronics Engineers. Este estándar es el usado actualmente por casi todos los procesadores.

La primera norma IEEE 754 se publicó en el 1985 e incluía únicamente la representación de números en binario. Sus formatos básicos eran simple y doble precisión. En el 2008 se publicó una segunda versión donde se incluía también la representación de números en decimal con dos formatos básicos y se añadía un formato básico binario con precisión cuádruple. En el 2019 se publicó una tercera versión con modificaciones menores.

Los cinco formatos básicos y sus parámetros más importantes son

$$ \begin{array}{|c|ccc|cc|} \hline & \mathrm{Formatos}& \mathrm{binarios} & (b = 2)& \mathrm{Formatos}\;\mathrm{decimales}&(b= 10)\\ \hline \mathrm{parámetro} & \mathrm{binary32} & \mathrm{binary64} & \mathrm{binary128} & \mathrm{decimal64} & \mathrm{decimal128}\\ \hline \hline \mathrm{precisión} (p) & 24 & 53 & 113 & 16 & 34\\ e_{max} & +127 & +1023 & +16383 & +384 & +6144\\ \hline \end{array} $$

El formato por defecto en Computación Numérica es actualmente el binario en doble precisión. Vamos a estudiar en más detalle los formatos binarios en simple y doble precisión.

Formato normalizado

Número decimal

Sea el número decimal $314,15$. Para normalizarlo

  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 $10^n$ siendo $n$ el número de posiciones que hemos movido la coma a la izquierda o $10^{-n}$ siendo $n$ el número de posiciones que hemos movido la coma a la derecha.
  3. Le añadimos el signo.

El número anterior, normalizado sería

$$+3,1415\times10^2$$

cuyos elementos son

  • Signo: $+$
  • Mantisa: $3,1415$
  • Exponente: $2$

Además tenemos que la base es $10$.

Número binario

Sea el número binario $10101,11001$. Para normalizarlo aplicaríamos los mismos pasos que en el caso anterior pero teniendo en cuenta que la base ahora es 2 y por lo tanto, este número normalizado sería

$$+1,010111001\times2^4$$

con

  • Signo: $+$
  • Mantisa: $1,010111001$
  • Exponente: $4$ (tendríamos que expresarlo en binario)

Además tenemos que la base es $2$.

Representación del exponente

El exponente en esta norma será siempre un número entero con representación sesgada. Veamos cómo funciona con un ejemplo. Supongamos que tenemos $m = 4$ bits donde podemos almacenar 4 dígitos binarios. Podríamos almacenar $2^m = 2^4 = 16$ combinaciones diferentes con las que podríamos representar los siguientes números

$$ \begin{array}{ccccc} \hline \mathrm{Representación} & \mathrm{Valor} & &\mathrm{Enteros}\\ \mathrm{binaria} & \mathrm{nominal} & &\mathrm{con}\; \mathrm{signo}\; \mathrm{(Expo.)}\\ (m=4\; bits)& & & sesgo=2^{m-1}-1 \\ \hline \mathtt{0000} & 0 & & Reservado\\ \mathtt{0001} & 1 & & -6\\ \mathtt{0010} & 2 & & -5\\ \mathtt{0011} & 3 & & -4\\ \mathtt{0100} & 4 & & -3\\ \mathtt{0101} & 5 & & -2\\ \mathtt{0110} & 6 & sesgo & -1\\ \mathtt{0111} & 7 & \longrightarrow & 0\\ \mathtt{1000} & 8 & -7 & 1\\ \mathtt{1001} & 9 & & 2\\ \mathtt{1010} & 10& & 3\\ \mathtt{1011} & 11& & 4\\ \mathtt{1100} & 12& & 5\\ \mathtt{1101} & 13& & 6\\ \mathtt{1110} & 14& & 7\\ \mathtt{1111} & 15& & Reservado\\ \hline \end{array} $$

Binary32 (precisión simple)

 

Utiliza 32 bits (4 bytes) distribuídos:

  • 1 bit para el signo.
  • 8 bits para el exponente.
  • 23 bits para la mantisa.

Signo

Se utiliza un $\mathtt{0}$ si el signo es positivo y un $\mathtt{1}$ si el signo es negativo.

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 =2^{8-1}-1 =2^7-1 = 128-1 = 127$$

para obtener el valor representado

$$ \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{1111\,1100}& 252 & & 125 \\ \mathtt{1111\,1101}& 253 & & 126 \\ \mathtt{1111\,1110}& 254 & & 127 \\ \mathtt{1111\,1111}& 255 & & R\\ \hline \end{array} $$

Por lo tanto el exponente mínimo representado es $e_{min} = -126$ y el máximo $e_{max} = 127.$

Mantisa

En binario, en la representación normalizada, el dígito a la izquierda de la coma es siempre $\mathtt{1}$, no se representa y se llama el bit escondido. Por lo tanto, aunque tenemos $23$ dígitos binarios para almacenar estamos usando uno más y la precisión es $24.$


Binary64 (precisión doble)

Utiliza 64 bits (8 bytes) distribuídos:

  • 1 bit para el signo.
  • 11 bits para el exponente.
  • 52 bits para la mantisa.

Signo

Se utiliza un $\mathtt{0}$ si el signo es positivo y un $\mathtt{1}$ si el signo es negativo.

Exponente

Tenemos $m=11$ bits para el exponente. Por lo tanto hay $2^m = 2^{11} = 2048$ combinaciones distinta y, en principio, podemos representar $2048$ números. Como empezamos el valor nominal empieza en $0$ acabará en $2047$. El primer número, $\mathtt{0000\,0000\,000}$, y el último, $\mathtt{1111\,1111\,111}$ se reservan. Y como la representación es sesgada, tenemos que restar el

$$sesgo=2^{m-1}-1 =2^{11-1}-1 = 2^{10}-1 =1024-1 = 1023$$

para obtener el valor representado

$$ \begin{array}{cccc} \hline \mathrm{Número}\; \mathrm{binario} & \mathrm{Valor}\; \mathrm{nominal} & & \mathrm{Valor}\; \mathrm{representado}\\ \hline \mathtt{0000\,0000\,000}& 0& & R\\ \mathtt{0000\,0000\,001}& 1& & -1022\\ \mathtt{0000\,0000\,010}& 2& & -1021\\ \mathtt{0000\,0000\,011}& 3& & -1020\\ \cdots & \cdots & -1023 & \cdots\\ \cdots & \cdots & \longrightarrow & \cdots\\ \mathtt{1111\,1111\,100}& 2044 & & 1021 \\ \mathtt{1111\,1111\,101}& 2045 & & 1022 \\ \mathtt{1111\,1111\,110}& 2046 & & 1023 \\ \mathtt{1111\,1111\,111}& 2047 & & R\\ \hline \end{array} $$

Por lo tanto el exponente mínimo representado es $e_{min} = -1022$ y el máximo $e_{max} = 1023.$

Mantisa

En binario, en la representación normalizada, el dígito a la izquierda de la coma es siempre $\mathtt{1}$, no se representa y se llama el bit escondido. Por lo tanto, aunque tenemos $52$ dígitos binarios para almacenar estamos usando uno más y la precisión es $53.$


Ejercicio

Si el número

$$ \begin{array}{|c|c|c|} \hline \mathrm{Signo} & \mathrm{Exponente} & \mathrm{Mantisa}\\ 1\,\mathrm{bit} & 8\,\mathrm{bits} & 23\,\mathrm{bits} \\ \hline \mathtt{1}&\mathtt{1000\,1101}&\mathtt{0110\,1000\,0000\,0000\,0000\,000}\\ \hline \end{array} $$

sigue la norma IEEE 754 para representación en punto flotante con precisión simple, calcular su representación en base 10.


Signo

Como es $\mathtt{{\color{red}1}}$ $\longrightarrow$ signo negativo

Exponente

El valor nominal del exponente $\mathtt{{\color{red}{1000\,1101}}}$ teniendo en cuenta la posición de cada dígito

$$ \begin{array}{ccccccc} \tiny{(7)}&\tiny{(6)}&\tiny{(5)}&\tiny{(4)}& \,\tiny{(3)}&\tiny{(2)}&\tiny{(1)}&\tiny{(0)}& & \\ \mathtt{1}&\mathtt{0}&\mathtt{0}&\mathtt{0}&\,\mathtt{1}&\mathtt{1}&\mathtt{0}&\mathtt{1} \end{array} $$

es

$$2^7+2^3+2^2+2^0=128+8+4+1=141$$

Y si tenemos en cuenta que para $m=8$ bits, $sesgo = 2^{m-1}-1 = 2^{8-1}-1=2^7-1=128-1=127$

El valor del exponente es $141-127=14$.

$$ \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}{1000\,1101}}}& {\color{red}{141}}& & {\color{red}{14}}\\ \cdots & \cdots & & \cdots\\ \cdots & \cdots & & \cdots\\ \mathtt{1111\,1100}& 252 & & 125 \\ \mathtt{1111\,1101}& 253 & & 126 \\ \mathtt{1111\,1110}& 254 & & 127 \\ \mathtt{1111\,1111}& 255 & & R\\ \hline \end{array} $$

Mantisa

Los dígitos almacenados de la mantisa son $\mathtt{{\color{ForestGreen}{0110\,1000\,0000\,0000\,0000\,000}}}$ y teniendo en cuenta el bit escondido, que es uno, la mantisa es

$$\mathtt{1,{\color{ForestGreen}{0110\,1000\,0000\,0000\,0000\,000}}}$$

o también

$$\mathtt{1,{\color{ForestGreen}{0110\,1}}}$$$$ \begin{array}{ccccccc} \tiny{(0)}&&\tiny{(-1)}&\tiny{(-2)}&\tiny{(-3)}&\tiny{(-4)}&\tiny{(-5)}\\ \mathtt{1}&,&\mathtt{{\color{ForestGreen}0}}&\mathtt{{\color{ForestGreen}1}}&\mathtt{\color{ForestGreen}1}&\,\mathtt{{\color{ForestGreen}0}}&\mathtt{\color{ForestGreen}1} \end{array} $$

Número

Por lo tanto, si escribimos el número este es

$${\color{red}-}\mathtt{1,{\color{ForestGreen}{0110\,1}}}\times 2^{\color{red}{14}} \quad \longrightarrow \quad -(1+2^{-2}+2^{-3}+2^{-5})\times2^{14} = \fbox{$-$23040} $$