Contenidos
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 < 128Conversió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:
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 < 1024Conversió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: