Coma flotante

Coma flotante

La representación en coma flotante más importante es la definida en la norma 754 IEEE (ANSI/IEEE Std 754-1985)

Este estándar se desarrolló para facilitar la portabilidad de los programas de un procesador a otro y para alentar el desarrollo de programas numéricos sofisticados

Este estándar ha sido ampliamente adoptado y se utiliza prácticamente en todos los procesadores y coprocesadores aritméticos actuales

Hay dos representaciones en coma flotante:

  • Formato simple (32 bits)
  • Formato doble (64 bits)

Formato simple (32 bits)

En el formato simple se utiliza el siguiente formato para almacenar una palabra (32 bits):

Bit de signo Exponente Mantisa
1 bit 8 bits 23 bits

Dado un E_1=\text{ exponente } + 127 (127 es el máximo número positivo del exponente) tenemos que:

00000000_{(2}\leq E_1\leq 11111111_{(2}

Si denotamos (E1)_{(10} a la conversión decimal de E_1, tenemos que:

0\leq (E1)_{(10}\leq 2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255

O lo que seria lo mismo:

-127\leq (E_1)_{(10} -127\leq 128

Si denotamos \alpha=(E_1)_{(10} -127 tenemos que:

-127\leq\alpha\leq 128
(E_1)=\alpha+127

Denotamos s como el bit de signo y M como la mantisa. A raíz de esto, surgen dos tipos de números:

  • Números normales
    -127 < \alpha < 128

    Conversión a número normal: (-1)\cdot s \cdot 1,M \cdot 2^\alpha

  • Números subnormales
    \alpha = (-127)

    Conversión a número subnormal: (-1)\cdot s \cdot 0,M \cdot 2^{-126}

  • \alpha = 128

    Da lugar a excepciones del tipo +\infty, -\infty\text{ y NaN} (no es un número, Not a Number del inglés)

Se utiliza un bit escondido (hidden bit del inglés) en la mantisa. Se toma el primer dígito que siempre es a_1 = 1. Este bit escondido no hará falta almacenarlo, consiguiendo así unos cuantos números más

Número Decimal Binario
\tiny \text{Máximo número normal positivo} \tiny 3,40282347 \cdot 10^{38} \tiny\text{0 11111110 11111111111111111111111}
\tiny \text{Máximo número normal negativo} \tiny -3,40282347 \cdot 10^{38} \tiny \text{1 11111110 11111111111111111111111}
\tiny \text{Mínimo número normal positivo} \tiny 1,17549435 \cdot 10^{-38} \tiny \text{0 00000001 00000000000000000000000}
\tiny \text{Mínimo número normal negativo} \tiny -1,17549435 \cdot 10^{-38} \tiny \text{1 00000001 00000000000000000000000}
\tiny \text{Máximo número subnormal positivo} \tiny 1,17549421 \cdot 10[{-38} \tiny \text{0 00000000 11111111111111111111111}
\tiny \text{Máximo número subnormal negativo} \tiny -1,17549421 \cdot 10[{-38} \tiny \text{1 00000000 11111111111111111111111}
\tiny \text{Mínimo número subnormal positivo} \tiny 1,40129846 \cdot 10^{-45} \tiny \text{0 00000000 00000000000000000000001}
\tiny \text{Mínimo número subnormal negativo} \tiny -1,40129846 \cdot 10^{-45} \tiny \text{1 00000000 00000000000000000000001}
\tiny \text{+0} \tiny 0,0 \tiny \text{0 00000000 00000000000000000000000}
\tiny \text{-0} \tiny -0,0 \tiny \text{1 00000000 00000000000000000000000}
\tiny +\infty \tiny +\infty \tiny \text{0 11111111 00000000000000000000000}
\tiny -\infty \tiny -\infty \tiny \text{1 11111111 00000000000000000000000}
\tiny \text{NaN} \tiny NaN \tiny \text{(0 }\acute{o}\text{ 1) 11111111 (alg}\acute{u}\text{n 1)}

Conversiones

Ejemplo: convertir el 3737 a formato simple (32 bits)

Es positivo, por tanto el signo es 0

Número Cociente Resto
\frac{3737}{2} 1868 1
\frac{1868}{2} 934 0
\frac{934}{2} 467 0
\frac{467}{2} 233 1
\frac{233}{2} 116 1
\frac{116}{2} 58 0
\frac{58}{2} 29 0
\frac{29}{2} 14 1
\frac{14}{2} 7 0
\frac{7}{2} 3 1
\frac{3}{2} 1 1

Entonces tenemos que la parte binaria es:

3737_{(10} = 111010011001_{(2}

Para el exponente vamos a necesitar mover 12 cifras decimales, por tanto debemos hacer 127 + 11 = 138 (sumamos 11 porque el bit escondido no se cuenta)

Número Cociente Resto
\frac{138}{2} 69 0
\frac{69}{2} 34 1
\frac{34}{2} 17 0
\frac{17}{2} 8 1
\frac{8}{2} 4 0
\frac{4}{2} 2 0
\frac{2}{2} 1 0

Entonces tenemos que el exponente es:

138_{(10} = 10001010_{(2}

Entonces tenemos que:

3737_{(10} = \text{0 10001010 11010011001000000000000}_{(2}

Formato doble (64 bits)

En el formato simple se utiliza el siguiente formato para almacenar dos palabras (64 bits):

Bit de signo Exponente Mantisa
1 bit 11 bits 52 bits

Dado un E_1=\text{ exponente } + 1023 (1023 es el máximo número positivo del exponente) tenemos que:

00000000000_{(2}\leq E_1\leq 11111111111_{(2}

Si denotamos (E1)_{(10} a la conversión decimal de E_1, tenemos que:

0\leq (E1)_{(10}\leq 2^{10}+2^9+2^8+2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=2047

O lo que seria lo mismo:

-1023\leq (E_1)_{(10} -1023\leq 1024

Si denotamos \alpha=(E_1)_{(10} -1023 tenemos que:

-1023\leq\alpha\leq 1024
(E_1)=\alpha+1023

Denotamos s como el bit de signo y M como la mantisa. A raíz de esto, surgen dos tipos de números:

  • Números normales
    -1023 < \alpha < 1024

    Conversión a número normal: (-1)\cdot s \cdot 1,M \cdot 2^\alpha

  • Números subnormales
    \alpha = (-1023)

    Conversión a número subnormal: (-1)\cdot s \cdot 0,M \cdot 2^{-1022}

  • \alpha = 1024

    Da lugar a excepciones del tipo +\infty, -\infty\text{ y NaN} (no es un número, Not a Number del inglés)

Se utiliza un bit escondido (hidden bit del inglés) en la mantisa. Se toma el primer dígito que siempre es a_1 = 1. Este bit escondido no hará falta almacenarlo, consiguiendo así unos cuantos números más

Número Decimal Binario
\tiny \text{Máximo número}\\ \text{normal positivo} \tiny 1,7976931 \cdot 10^{308} \tiny \text{0 11111111110 1111111111111111111111111111111111111111111111111111}
\tiny \text{Máximo número}\\ \text{normal negativo} \tiny -1,7976931 \cdot 10^{308} \tiny \text{1 11111111110 1111111111111111111111111111111111111111111111111111}
\tiny \text{Mínimo número}\\ \text{normal positivo} \tiny 2,2250738 \cdot 10^{-308} \tiny \text{0 00000000001 0000000000000000000000000000000000000000000000000000}
\tiny \text{Mínimo número}\\ \text{normal negativo} \tiny -2,2250738 \cdot 10^{-308} \tiny \text{1 00000000001 0000000000000000000000000000000000000000000000000000}
\tiny \text{Máximo número}\\ \text{subnormal positivo} \tiny 2,2250738 \cdot 10^{-308} \tiny \text{0 00000000000 1111111111111111111111111111111111111111111111111111}
\tiny \text{Máximo número}\\ \text{subnormal negativo} \tiny -2,2250738 \cdot 10^{-308} \tiny \text{1 00000000000 1111111111111111111111111111111111111111111111111111}
\tiny \text{Mínimo número}\\ \text{subnormal positivo} \tiny 4,9406564 \cdot 10^{-324} \tiny \text{0 00000000000 0000000000000000000000000000000000000000000000000001}
\tiny \text{Mínimo número}\\ \text{subnormal negativo} \tiny -4,9406564 \cdot 10^{-324} \tiny \text{1 00000000000 0000000000000000000000000000000000000000000000000001}
\tiny +0 \tiny 0,0 \tiny \text{0 00000000000 0000000000000000000000000000000000000000000000000000}
\tiny -0 \tiny -0,0 \tiny \text{1 00000000000 0000000000000000000000000000000000000000000000000000}
\tiny +\infty \tiny +\infty \tiny \text{0 11111111111 0000000000000000000000000000000000000000000000000000}
\tiny -\infty \tiny -\infty \tiny \text{1 11111111111 0000000000000000000000000000000000000000000000000000}
\tiny \text{NaN} \tiny \text{NaN} \tiny \text{(0 }\acute{o}\text{ 1) 11111111111 (alg}\acute{u}\text{n 1)}

Conversiones

Ejemplo: convertir el 3737 a formato doble (64 bits)

Es positivo, por tanto el signo es 0

Número Cociente Resto
\frac{3737}{2} 1868 1
\frac{1868}{2} 934 0
\frac{934}{2} 467 0
\frac{467}{2} 233 1
\frac{233}{2} 116 1
\frac{116}{2} 58 0
\frac{58}{2} 29 0
\frac{29}{2} 14 1
\frac{14}{2} 7 0
\frac{7}{2} 3 1
\frac{3}{2} 1 1

Entonces tenemos que la parte binaria es:

3737_{(10} = 111010011001_{(2}

Para el exponente vamos a necesitar mover 12 cifras decimales, por tanto debemos hacer 1023 + 11 = 1034 (sumamos 11 porque el bit escondido no se cuenta)

Número Cociente Resto
\frac{1034}{2} 517 0
\frac{517}{2} 258 1
\frac{258}{2} 129 0
\frac{129}{2} 64 1
\frac{64}{2} 32 0
\frac{32}{2} 16 0
\frac{16}{2} 8 0
\frac{8}{2} 4 0
\frac{4}{2} 2 0
\frac{2}{2} 1 0

Entonces tenemos que el exponente es:

138_{(10} = 10000001010_{(2}

Entonces tenemos que:

\tiny 3737_{(10} = \text{0 10000001010 1101001100100000000000000000000000000000000000000000}_{(2}