Está en la página 1de 19

11-9-2016 ESTÁNDAR IEEE 754

Punto Flotante

Yamil Armando Cerquera Rojas


UNIVERSIDAD SURCOLOMBIANA
ESTÁNDAR IEEE 754 PARA LA REPRESENTACIÓN EN COMA FLOTANTE
Yamil Armando Cerquera Rojas1
Agosto 15 de 2016
Email: yacerque@gmail.com

Tabla de contenido
Introducción ................................................................................................................................2
Números enteros en binario ....................................................................................................2
Números reales en punto flotante ...........................................................................................3
Fracciones binarias: ..................................................................................................................4
Representación de cifras binarias ...............................................................................................6
¿Cómo se escribe un número en el Estándar IEEE 754? ............................................................6
Precisión Simple en el Estándar IEEE 754..................................................................................6
Curiosidades .........................................................................................................................7
Ejemplo.................................................................................................................................7
Ejemplo.................................................................................................................................8
Ejemplo.................................................................................................................................8
Ejemplo.................................................................................................................................9
Ejemplo.................................................................................................................................9
Precisión Doble en el Estándar IEEE 754 .................................................................................12
Ejemplos.............................................................................................................................14
Valores de especial cuidado en la norma IEEE-754 ...........................................................15
Referencias Bibliográficas .........................................................................................................18

1 Ingeniero Agrícola – U Surcolombiana, Especialista en Sistemas – U Nacional, Especialista en Administración de la


Informática Educativa – U de Santander, Magister en Administración de Empresas – U Viña del Mar Chile.
Introducción
La aritmética en coma flotante ha sido objeto de polémicas y múltiples formas de
implementarla pero fue en 1985 cuando el IEEE2 terminó y publicó un documento donde
estandarizaba la forma de representar los números en punto flotante y cómo realizar las
operaciones aritméticas. Esta norma se conoce como IEEE 754, y ha sido un fuerte dolor de
cabeza para más de un estudiante de Informática en su primer año.

Ha día de hoy se considera el estándar de facto en todos los ordenadores personales. Pero,
¿cómo funciona exactamente?.

Existen varios formatos para la representación de números flotantes en un computador,


aunque el estándar y por ello el utilizado en la mayoría de los computadores, pero no en
todos, es el formato ANSI/IEEE Standard 754-1985, que se denominará IEEE-754 para abreviar.
Este estándar ANSI/IEEE fue preconizado por W. Kahan y utiliza un sistema de representación
desarrollado previamente por I.B. Goldberg3. En este formato los números flotantes se
representan en sistema binario (base 2), con m y e bits para la mantisa M y para el exponente
E, respectivamente, como aparece en la tabla 2. De esta forma la representación de un
número flotante requiere de 𝑚 + 𝑒 bits, número que normalmente es un múltiplo par de 16 (2
bytes). Se pueden representar números en precisión simple (float), doble (double), long
extendido (long double) y cuádruple (cuádruple) que tienen 32 (𝑒 = 8), 64 (𝑒 = 11), 80 (e=15)
y 128 (𝑒 = 15) bits de longitud, respectivamente.
Números enteros en binario
Para representar un número entero en decimal basta añadir, si es negativo, el signo
ortográfico menos; por ejemplo, -23. En binario se puede hacer lo mismo, dedicando un bit
para el signo;

Sin embargo, entonces el cero tiene dos representaciones equivalentes +0 y -0. Para evitar
esta duplicidad, en los ordenadores los números enteros negativos de n dígitos se presentan
en complemento a dos o por exceso.

En complemento a dos, el bit más significativo representa el signo del número entero. Si el
signo se representa con un 0, el valor es positivo, y si es 1, el valor es negativo. El módulo de
un número negativo se calcula, complementado a uno el número, es decir, cambiando los bits
1 por 0 y los 0 por 1, y luego sumándole 1. Por ejemplo, utilizando 4 bits,

 x x x
El número (0111)2 representa el valor positivo 7, de los cual el 0 representa el sigo positivo “+”
y 111 la cantidad representada así: 1*22+1*21+1*20)=4+2+1=7, y el número (1010)2 representa
el valor negativo -6, de lo cual el 1 representa el signo negativo “-“, y 010 representa la
cantidad negativa almacenada (-6). Hay que tener cuidado con las cifras almacenadas
negativas que se guardan en complemento. Si se le suma uno a su complemento a uno (0101);
se obtiene: (0101)2 + 1 = (0110)2 que corresponde al valor de 6. (Entonces el valor almacenado
corresponde al 6 negativo “-6”.

Es fácil verificar que en complemento a dos, el cero tiene una única representación, todos los
bits a cero; además, el intervalo de números enteros representables en complemento a dos

2
https://www.ieee.org
3 D. Goldberg, “What Every Computer Scientist Should Know About Floating-Point Arithmetic,” ACM Computing
Surveys, Vol. 23, pp. 153–230 (1991). Reproduced at http://citeseer.nj.nec.com/goldberg91what.html.
con n bits es [−2𝑛−1 , 2𝑛−1 − 1]; finalmente, en orden creciente de representación, los

números están ordenados de la forma 0,1,2,...,2n1 1,2n1 1,...,2,1 . Como se ve, la 
ventaja de esta representación es que el cero se representa como tal, sin embargo, tiene la
desventaja de que cambia el orden de los números enteros ya que los negativos son “más
grandes” que los positivos.

En casi todos los ordenadores los números enteros se representan y almacenan en


complemento a dos. La longitud n en bits de un número entero suele ser un múltiplo (par) de
8, y según esta se denominan entero corto (short integer), entero (integer), entero largo (long
integer), y entero muy largo (very long integer), cuando n = 8, 16, 32 y 64, respectivamente.

En algunos casos el orden “incorrecto” de los números representados en complemento a dos


es un problema grave que hay que resolver. La solución más simple es utilizar la
representación en exceso a 𝑧, que consiste en sumar al número decimal la cantidad z y luego
representarlo en binario con n bits. Normalmente, solo se utilizan 𝑧 = 2𝑛−1 ó 𝑧 = 2𝑛−1 − 1.
Por ejemplo, con cuatro bits y 𝑧 = 2𝑛−1 = 24−1 = 23 = 8, el número -8 se representa como
(0000)2, el -7 como (0001)2, el 0 como (1000)2, el 7 como (1111)2, y el 8 no es representable
con sólo cuatro bits. Determinar cómo se representarían estos números con 𝑧 = 2𝑛−1 − 1.

Tomando 𝑧 = 2𝑛−1 , es fácil verificar que el cero tiene representación única, el bit más
significativo a uno y el resto a cero, y que el intervalo de números enteros con n bits es
[−2𝑛−1 , 2𝑛−1 − 1], el mismo que en complemento a dos, pero ahora en orden creciente se
encuentra el orden usual, primero los negativos (cuyo bit más significativo es 0) y luego los
positivos (en los que es 1), es decir,

 2 n1 n1
,2 1,...,2,1,0,1,2,...,2n1 1 . 
La otra posibilidad es tomar 2𝑛−1 − 1, con lo que el cero se representa con el bit más
significativo a cero y el resto a uno, el intervalo representable es  2 n1
1* 2n1 , y el
orden es el usual, o sea,

[ 2n 1 +1,..., 2, 1,0,1,2,...,2n 1 1,2n 1].


Números reales en punto flotante
Convencionalmente, para representar los números reales se introduce el punto decimal 4. De
esta forma, los números positivos menores que la unidad se representan como:

0.a1a2 ...an  a1101  a2102  ...  an10n


Por ejemplo: 0.123 = 1 ∗ 10−1 + 2 ∗ 10−2 + 3 ∗ 10−3 .

Y de igual forma: 456.123= 4 *102 +5*101 +6 *100 +1*10 1 + 2 *10 2 +3*10 3

4En castellano se suele utilizar la coma decimal, reservando el punto para los millares, por lo que se suele hablar de
números en coma flotante. Sin embargo, dado que la mayoría de los programas y lenguajes de ordenador utilizados
para problemas numéricos utiliza el punto decimal, he preferido utilizar el punto decimal. Además, no se utiliza la
coma para los millares, para evitar confusiones.
Dado que las cantidades no enteras (en coma flotante) pueden tener un número infinito de
dígitos, se almacenan en memoria RAM de un ordenador mediante un formato denominado
de punto flotante, que utiliza solo un número finito de dígitos.

Figura 1 Representación de los números flotantes positivos en un sistema (m; e) = (3; 2). Los números con asterisco y
círculo son normales y subnormales, respectivamente.

En general, la representación de una cantidad x en punto flotante, en una base general b toma
la forma:
d1 d2 dn E
x =±(0.d1d2...dn )b bE =±( 1 + 2 +...+ n )b d1 ≠0
b b b
Donde 0.d1d2...dn es la mantisa M y E es el exponente entero de la cantidad en punto
flotante. La condición d1  0 , o de normalización del valor, se impone para asegurar la
representación única de cada número en punto flotante. Dado un número real x   se
escribirá su representación en punto flotante como 𝑓𝑙(𝑥), y se denotará al conjunto (finito) de
todos los números flotantes como IF, de forma que 𝑓𝑙(𝑥)  IF  IR. Ejemplo:

0.10111 1* 2-1  0 * 2-2  1* 2-3  1* 2-4  1* 25 que sería igual a


corresponde a
1 0 1 1 1 23
+ + + + igual a = 0.71875000 000000.
2 4 8 16 32 32
1 0 0 1 8
(.100)2 = + + = =
21 22 23 2 16
1 0 1 5 10
(.101)2 = + + = =
21 22 23 8 16
La precisión, también llamada número de dígitos significativos, de una cantidad representada
en coma o punto flotante, viene determinada por el número de dígitos m de su mantisa. Por
ejemplo, una mantisa de 24 dígitos binarios corresponde a unos 7 dígitos decimales de
precisión, y una de 52 a unos 16. Hay que tener en cuenta que cuanto mayor es la precisión
utilizada, mayor es la necesidad de almacenamiento para guardar el valor y más tiempo de
cómputo es necesario para realizar operaciones con él.

El conjunto de números flotantes no está distribuido de forma uniforme entre el flotante


máximo y el mínimo. En la tabla 1 se representan todos los números flotantes positivos con
una mantisa de tres dígitos binarios y un exponente de dos dígitos binarios, es decir,
1  E  2 . Como se puede ver en la Figura 1, la densidad de los números se reduce
conforme se aleje del origen.
Fracciones binarias:
Las fracciones binarias pueden expresarse como sumas en las que aparecen potencias
negativas de 2. Si R es un número real tal que 0 < R < 1, entonces existe una sucesión de cifras
𝑑1 ,𝑑2 ,....,𝑑n , todas ellas en {0, 1}, tales que:
Ecuación 1
   
r  d1 * 21  d2 * 22  ...  dn * 2n 
Que suele expresarse en notación fraccionaria binaria como: R = (0. 𝑑1 ,𝑑2 ,...,𝑑n )2
Puede desarrollarse un algoritmo para representar fracciones en sistema binario:
Multiplicando por 2 ambos miembros de la Ecuación 1:
Ecuación 2
2R  d1  ((d2 * 21 )  (d3 * 22 )  ...  (dn * 2n1 ))

 
De aquí se observa que d1  2R , donde el símbolo x denota la parte entera de x. 
Continuando con el proceso, se toma la parte fraccionaria de la igualdad dada en la Ecuación 2
y se escribe:
Ecuación 3
F1  frac(2R)  (d2 * 21 )  (d3 * 22 )  ...  (dn * 2n1 )

Donde frac(x) denota la parte fraccionaria del número x. Multiplicando por 2 ambos miembros
de la Ecuación 3 se tiene:
Ecuación 4

2F1  d2  (d3 * 21 )  (d4 * 22 )  ...  (dn * 2n2 ) 
Tomando la parte entera de esta igualdad: d2  2F1 

El proceso continúa posiblemente sin fin (si R tiene una representación en base 2 que no es
finita ni periódica) y genera de forma recurrente dos sucesiones {𝑑k } y {𝐹k }, donde:
dk  2Fk1  y Fk  frac(2Fk1 )
7
Ejemplo: Sea la fracción . Represéntala como una fracción binaria.
10

Solución: 𝑅 = 0.7, en sistema de numeración decimal y para convertirla en Binario, se realiza


el siguiente procedimiento:

Tabla 1. Conversión de una fracción en decimal a binario

Valor R o 𝐹𝑖 Conversión 2*R Fracción Entera 𝑑𝑖 Fracción Decimal 𝐹𝑖 Valor en Binario = 𝑑𝑖


0.7 2R = 1.4 𝑑1 = [1.4] = 1 𝐹1 = 𝑓𝑟𝑎𝑐 (1.4) = 0.4 1
𝐹1 = 0.4 2𝐹1 = 0.8 𝑑2 = [0.8] = 0 𝐹2 = 𝑓𝑟𝑎𝑐(0.8) = 0.8 0
𝐹2 = 0.8 2𝐹2 = 1.6 𝑑3 = [1.6] = 1 𝐹3 = 𝑓𝑟𝑎𝑐(1.6) = 0.6 1
𝐹3 = 0.6 2𝐹3 = 1.2 𝑑4 = [1.2] = 1 𝐹4 = 𝑓𝑟𝑎𝑐(1.2) = 0.2 1
𝐹4 = 0.2 2𝐹4 = 0.4 𝑑5 = [0.4] = 0 𝐹5 = 𝑓𝑟𝑎𝑐(0.4) = 0.4 0
𝐹5 = 0.4 2𝐹5 = 0.8 𝑑6 = [0.8] = 0 𝐹6 = 𝑓𝑟𝑎𝑐(0.8) = 0.8 0
𝐹6 = 0.8 2𝐹6 = 1.6 𝑑7 = [1.6] = 1 𝐹7 = 𝑓𝑟𝑎𝑐(1.6) = 0.6 1

Nótese que 2𝐹2 = 1.6 = 2𝐹6 . Se tiene entonces que 𝑑k = 𝑑k+4 y 𝐹k = 𝐹k+4, para 𝑘 = 2,3,4.
7
̅̅̅̅̅̅̅01100110
Es decir, la fracción tiene una representación binaria periódica: = 10110 ̅̅̅̅̅̅̅0 … ..
10

7 1 0 1 1 0
Periodicidad que se denota por: ̅̅̅̅̅̅̅ =
= 10110 + + + +
10 21 22 23 24 25

Para comprobar el resultado anterior, se emplea la expresión de conversión a sistema decimal:



R  d j (2) j , d j 0,1
j 1
Sustituyendo los valores del ejercicio anterior en la expresión:
1 𝑥 2−1 +0 𝑥 2−2 + 1 𝑥 2−3 +1 𝑥 2−4 + 0 𝑥 2−5
1 1 1 8 2 1 11
Es decir:        0.6875 0.7
2 8 16 16 16 16 16
Representación de cifras binarias
Matemáticamente, ¿cómo funciona este sistema de representación? Dado un número real “x”
será representado como su signo, multiplicado por el valor de su mantisa (número
normalizado tipo notación científica) y multiplicado además por la base de representación
elevada al valor del exponente sesgado.
Ecuación 5
𝑠𝑖𝑔𝑛(𝑥) ∗ 𝑚𝑎𝑛𝑡𝑖𝑠𝑠𝑎 ∗ 2𝑒𝑥𝑝
Ecuación 6. Sesgo de exponente
𝑒𝑥𝑝𝑠 = 2𝑛−1 − 1, 𝑛 = # 𝑏𝑖𝑡𝑠 𝑝𝑎𝑟𝑎 exp 𝑑𝑒 𝑙𝑎 𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒
Hablando en términos de representación numérica en computadores y tomando como
ejemplo el caso de simple precisión donde se reserva un bit para el signo, 8 bits para el
exponente (𝑛 = 8) y 23 bits para la mantisa se tiene:

 Bit de signo: Bit 0, representa un positivo y el bit 1 representa un negativo


 El exponente se representa sesgado al valor dado por la Ecuación 6. En el caso de simple
precisión sería: 𝑒𝑥𝑝𝑠 = 28−1 − 1 = 27 − 1 = 127. Sise requiere almacenar un
exponente determinado se almacena aumentado en el valor de sesgo.
 La mantisa en binario es un número del tipo 1.xxxxx donde el primer 1 no fraccionario
se asume y no se representa dentro del formato.
¿Cómo se escribe un número en el Estándar IEEE 754?
El estándar IEEE 754 ha sido definido por el Instituto de Ingenieros Eléctricos y Electrónicos
(Institute of Electrical and Electronics Engineers, IEEE) y establece dos formatos básicos para
representar a los números reales en la computadora digital: precisión simple, precisión doble y
Precisión doble extendida y precisión cuádruple.

Simple precisión (32 bits), Doble precisión (64 bits) y Doble precisión extendida (80 Bits) y
Cuádruple precisión (120 Bits).
Precisión Simple en el Estándar IEEE 754
En precisión simple, para escribir un valor fraccionario se usan 32 bits (4 bytes): 1 bit para el
signo (S) del número, 23 bits para la mantisa (M) y 8 bits para el exponente (E), que se
distribuyen de la forma expuesta en la Tabla 2 y Tabla 3:

Tabla 2. IEEE Representación Punto Flotante precisión simple

S Exponente=E Mantisa=M
1 E=8 Bit M=23 Bit
32 bits - 4 Bytes

Single: SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

Tabla 3. Representación de un número real con precisión simple en el estándar IEEE 754
31 30………..23 22. . . . . . . . . . . . . . . . . 0
S E M
Signo Exponente Mantisa
1 Bit 8 Bits 23 Bits

El exponente se suele almacenar en exceso a 2𝑛−1 − 1. Para el caso de la precisión sencilla


seria: 28−1 − 1 = 27 − 1 = 127.

El exponente desplazado permite emplear un rango de valores para los exponentes


comprendidos entre -126 y +127. Al desplazar estas cifras 127 valores entonces el rango
quedará almacenado como (1 a 254). Se excluyen el 0 y el 255, que se reservan para
representar valores especiales.

Mientras que, para la mantisa, normalmente se utiliza Signo Magnitud. Además, la mantisa se
suele normalizar colocando la coma decimal a la derecha del bit más significativo.

Precisión Negativos Positivos


Simple [−(2 − 2−23 ) ∗ 2127 , −(2−126 )] [2−126 , (2 − 2−23 ) ∗ (2127 )]

Curiosidades
Número más grande representable: ((2 − 2−23 ) ∗ 2127 )10 = 2128 − 2104
Número más pequeño representable (positivo y no cero): 1 ∗ 2−126 . Tendiendo a cero hay una
serie de valores reales no representables: [−2−126 , 0) ∪ (0, 2−126 ]∄ℝ.

Ambos rangos de representación son discontinuos, es decir, no se pueden representar todos


los números reales que existen entre dos cualesquiera de ellos. Esto es debido a que entre dos
números reales cualesquiera siempre existen infinitos números, sin embargo, sólo se dispone
de un número determinado de bits para representar a los números reales. Por esta razón, en
las computadoras digitales no se pueden representar a todos los números reales. Por ejemplo,
con precisión simple, alrededor del número cero (0) existen infinitos números reales, mayores
que -2-126 y menores que 2-126, que no son representables. Gráficamente:

−2−126 0 2−126

Cantidades no Representables
Valores no representables en el estándar IEEE 754 con precisión simple
Ejemplo
La cantidad numérica cinco mil setecientos setenta y siete (5.777) expresada en base decimal,
representarla en el formato flotante de precisión sencilla (4 Bytes). El valor 577710
corresponde a la cadena de dígitos binarios 10110100100012
1011010010001 = 1,011010010001 𝑥 212 , Valor normalizado
El exponente es 12 + 127 = 139. Valor 139 que es guardado como exponente. Este valor 139 es
equivalente a 10001011 en binario. Como la cantidad es positiva en S se almacena 0.

S E M
0 10001011 011 0100 1000 1000 0000 0000
1 Bit 8 Bits 23 Bits

𝑁𝑢𝑚𝑒𝑟𝑜 = (−1) 𝑠 ∗ (1 + 𝑀) ∗ (2𝐸−127 )


𝑁𝑢𝑚𝑒𝑟𝑜 = (−1)0 ∗ (1 + .011010010001) ∗ (2139−127 )
𝑁𝑢𝑚𝑒𝑟𝑜 = (1.011010010001) ∗ (212 )
𝑁ú𝑚𝑒𝑟𝑜 = 577710
Ejemplo
Dado el siguiente número binario en coma flotante, determinar el número decimal
correspondiente:

1 1001 0001 100 0111 0001 1000 0000 0000


1 Bit 8 Bits 23 Bits

El bit de signo es 1. El exponente desplazado es: 10010001 = 145; aplicando la fórmula, se


obtiene:
Número = (−1)1 (1.100011100011) (2145−127 )
𝑁ú𝑚𝑒𝑟𝑜 = (−1) (1.100011100011) (218 ) = −11000111000110000000
Este número binario en coma flotante es equivalente a: -815488 en decimal.
Ejemplo
Para escribir el número 101110,0101011101000011111000011111000100112 en el estándar
IEEE 754 con precisión simple, exponente en Exceso a 2𝑛−1 − 1 y mantisa en Signo Magnitud,
primero hay que normalizarlo:
1,011100101011101000011111000011111000100112 𝑥 25
El exponente, en Exceso a 2𝑛−1 − 1, será:
510 + (28−1 − 1)10 = 510 + (27 − 1)10 = 510 + (128 − 1)10 = 13210 = 10000100𝐸𝑥𝑐𝑒𝑠𝑜 𝑎 127
De la mantisa se cogen los bits 23 bits más significativos:
1,0111001010111010000111
El resto de bits no se pueden representar, ya que, no caben en la mantisa. Sin embargo,
cuando la mantisa se normaliza situando la coma decimal a la derecha del bit más significativo,
dicho bit siempre vale 1. Por tanto, se puede prescindir de él, y coger en su lugar un bit más de
la mantisa.
1,011100101011101000011111000011111000100112 𝑥 25
De esta forma, la precisión del número representado es mayor. Así, los bits de la mantisa
serán:
011 1001 0101 1101 0000 1111
Al bit omitido se le llama bit implícito. Por otra parte, el bit de signo vale 0, ya que, el número
es positivo. En consecuencia, el número se puede representar como:
31 30……..23 22. . . . . . . . . . . . . . . . . . . . . . 0
0 10000100 011 1001 0101 1101 0000 1111
Signo Exponente Mantisa
1 Bit 8 Bits 23 Bits
Los programadores, para representar a los números reales en este formato, suelen utilizar el
Sistema Hexadecimal.
Tabla 4. Representación en Hexadecimal

0100 0010 0011 1001 0101 1101 0000 1111

4 2 3 9 5 D 0 F
Así pues: 101110,0101011101000011111000011111000100112 = 42395D0F En Formato
Hexadecimal.
En este caso, los números no son exactamente iguales, ya que, con precisión simple no se han
podido almacenar todos los bits de la mantisa.
Ejemplo
Dado el número 3E400000CFL del estándar IEEE 754 con precisión simple, exponente en Exceso
a 2n-1-1 y mantisa en Signo Magnitud con bit implícito, para averiguar a qué número representa
en base 10, se pueden realizar los siguientes pasos:
Tabla 5. Representación del Hexadecimal a Binario

3 E 4 0 0 0 0 0

0011 1110 0100 0000 0000 0000 0000 0000

1. Obtener los bits del signo, de la mantisa y del exponente:

0 01111100 100 0000 0000 0000 0000 0000


1 Bit 8 Bits 23 Bits
Signo Exponente Mantisa

2. Pasar el exponente a base 10:

011111002 - (28-1 - 1)10 = 12410 - (27 - 1)10 = 12410 - (128 - 1)10 = 12410 - 12710 = -3
3. Escribir el número en notación científica. Para ello, la mantisa se debe escribir con el
bit implícito (1), seguido de la coma decimal (,) y de los bits de la mantisa
(10000000000000000000000), teniendo en cuenta que los ceros por la derecha se
pueden despreciar. Por otra parte, el número es positivo, ya que, el bit de signo es 0.
Por tanto, el número es: 1,1 x 2-3

4. Expresar el número en base 10. Para ello, hay dos formas de hacerlo, la primera es:

1,1 x 2-3=0,00112=(2-3+2-4)10=0,12510+0,062510=0,187510

y la segunda:

1,1 x 2-3=((20+2-1)x2-3)10=((1+0,5)x0,125)10=(1,5x0,125)10=0,187510

Por tanto,

3E400000CFL (PRECISIÓN SIMPLE)=1,1x2-3=0,00112=0,187510


Ejemplo
Dado el número 805C0000CFL del estándar IEEE 754 con precisión simple, exponente en Exceso
a 2n-1-1 y mantisa en Signo Magnitud con bit implícito, para averiguar a qué número representa
en base 10, se pueden realizar los siguientes pasos:

1. Convertir 805C000016 a base 2:


2. Tabla 6. Representación del Hexadecimal a Binario

8 0 5 c 0 0 0 0

1000 0000 0101 1100 0000 0000 0000 0000


3. Obtener los bits del signo, de la mantisa y del exponente:

1 0000 0000 101 1100 0000 0000 0000 0000


1 Bit 8 Bits 23 Bits
Signo Exponente Mantisa

4. Al observar que todos los bits del exponente son ceros (00000000) y la mantisa es
distinta de todo ceros, se deduce que es un caso especial. Se está representado a un
número muy pequeño sin bit implícito y, por tanto, el exponente es -126.

5. En notación exponencial, puesto que en este caso no se utiliza bit implícito, la mantisa
se escribe con un cero (0), seguido de la coma decimal (,) y de los bits de la mantisa
(10111000000000000000000). En cuanto al signo del número, es negativo, ya que, el
bit de signo es1. Con todo ello, el número es:
−0,10111 𝑥 2−126
6. Expresar el número en base 10:

El máximo valor que se puede representar en el formato IEEE754 de precisión simple, es decir
32 bits seria:

Fuente: https://www.h-schmidt.net/FloatConverter/IEEE754.html

Recuerde que la norma no permite usar en los 8 bits destinados a guardar el exponente los 8
bits 1. En la siguiente figura se muestra lo que almacenaría:
Fuente: https://www.h-schmidt.net/FloatConverter/IEEE754.html

Fuente: http://www.zator.com/Cpp/E2_2_4a1.htm
Precisión Doble en el Estándar IEEE 754
El formato de doble precisión, hoy en día el más utilizado, que tiene 𝑚 = 52 bits de mantisa,
𝑒 = 11 bits de exponente y 𝑆 = 1 𝑏𝑖𝑡 para el signo del valor almacenado.

Tabla 7. IEEE Representación Doble Precisión Punto Flotante


S Exponente Mantisa
1 E=11 Bit M=52 Bits
64 Bits - 8 Bytes
Double:
S EEEEEEE EEEEMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM

Tabla 8. Rangos representados en formato doble

Precisión Negativos Positivos


Doble ((2−52 − 2) ∗ 21023 , −2−1022 ) (2−1022 , (2 − 2−52 ) ∗ 21023 )

Es decir el rango de valores que se puede almacenar en una variable que ha sido declarada de
tipo double en lenguaje C es:

((2−52 − 2) ∗ 21023 , −2−1022 ) ≤ 𝑥 ≤ (2−1022 , (2 − 2−52 ) ∗ 21023 )10


10

Por otro lado, en precisión doble, para escribir un número real se emplean 64 bits (8 bytes): 1
bit para el signo (s) del número, 52 bits para la mantisa (m) y 11 bits para el exponente (exp).
Tabla 9. Representación de un número real con precisión doble en el estándar IEEE 754

63 62 52 51 0
S Exponente Mantisa
1 E=11 Bit M=52 Bits
64 Bits - 8 Bytes

Como el primer dígito de la mantisa, que está normalizada, debe ser necesariamente d1  1,
se aprovecha este bit para almacenar en su lugar el signo de la mantisa. Este formato permite
representar +0 y -0, lo que a veces puede ser ventajoso. Se reservan e=11 dígitos binarios para
el exponente y su signo. Este número entero se representa en exceso a 2𝑒−1 − 1 = 1023, por
lo que se pueden representar sólo los números enteros en el rango
  
2e 1 1.2e 1  1022,1024 . El exponente máximo 1024, se reserva para representar los
números excepcionales ±𝑥, y NaN (Not a Number). Los primeros se representan cuando la
mantisa es 0 y se producen cuando una operación aritmética genera un número más grande
que el máximo representable, es decir, se produce un desbordamiento por exceso u overflow.
NaN se genera en operaciones aritméticas de resultado no determinado, como
0  0,   ,  / , etc.

De esta forma, dados el bit de signo S, los 52 dígitos binarios de la mantisa M y el exponente E
representado como decimal positivo, el número flotante resultante es:
(−1) 𝑆 ∗ (1. 𝑀)2 ∗ 2𝐸−1023
Es fácil observar que hay números binarios de 64 bits que representan números flotantes con
exponente 0 que no se utilizan en el sistema descrito hasta ahora, ya que la mantisa siempre
está normalizada. Para aprovechar dichos valores se definen los números subnormales, y se
denomina normales a los que tienen la representación (Tabla 10). Los números subnormales
no tienen la mantisa normalizada y permiten representar números mucho más pequeños, en
valor absoluto, que los que se obtienen con los números normales.
Tabla 10. Formato binario de todos los números flotantes de doble precisión

El valor representado por un número subnormal con signo S, mantisa en binario M y


exponente decimal siempre 𝐸 = 0 es:
(−1)𝑆 ∗ (0. 𝑀)2 ∗ 21022
En la Tabla 10 se muestra la representación en binario de todos los números flotantes en doble
precisión, incluyendo como calcular su valor numérico en decimal.

Se denomina épsilon de la máquina "al valor asociado con al último dígito representable en la
mantisa cuando el exponente es cero”, más adelante se define este valor.

Tabla 11. Resumen de los parámetros de los números simple, doble y cuádruple en formato IEEE-754. Copyright
1985 by The Institute of Electrical and Electronics Engineers, Inc

Parámetro Simple Doble Cuádruple


Posibles números ( 2
me
)  2  4.295*10
32 9
 2  1.845*10
64 19
2 128
 3.403*1038
Precisión (m bits) 24 53 113
Épsilon de la máquina 223
 1.192*10 7
252
 2.220*10 16
2 112
 1.926*1034
Dígitos decimales 7  16  34
Exponente (e bits) 8 11 15
Exponentes posibles [−126,127] [−1022,1023] [−16382,16383]
Máximo normal 3.403*1038 1.798*10308 1.19*104932
Mínimo normal 1.175*1038 2.225*10308 3.362*104932
Mínimo subnormal 1.401*1045 4.941*10324 6.475*104966
En Fortran REAL*4 REAL*8 REAL*16
En C float double long double
En Matlab NO SI NO

Ejemplos
Si se quiere escribir el número 19,562510 en el estándar IEEE 754 con precisión doble,
exponente en Exceso a 2n-1-1 y mantisa en Signo Magnitud con bit implícito, los pasos a seguir
son:

1. Cambiar 19,562510 a base 2. Primero la parte entera:

Entero Parte Decimal


19 2 0.5625 * 2
9 1 1.125 1
4 1 0.250 0
2 0 0.500 0
1 0 1.0 1
0 1

De modo que: 19.562510 = 10011.10012

2. Normalizar el número binario obtenido 10011.10012 , colocando la coma decimal a la


derecha del bit más significativo:
10011.10012 = 1.00111001 ∗ 24
3. Escribir el exponente en Exceso a 2𝑛−1 − 1:

410 + (211-1 - 1)10 = 410 + (210 - 1)10 = 410 + (1024 - 1)10 = 102710 = 10000000011EX. a 1023
4. Establecer la mantisa utilizando bit implícito. Para ello, se cogen los ocho bits que
están a la derecha de la coma (00111001) y el resto de la mantisa se rellena con ceros:

0011 1001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

5. Expresar el número en el estándar IEEE 754 con precisión doble. En este caso, hay que
tener en cuenta que el bit de signo vale 0, ya que, el número es positivo:

6. Representar el número en hexadecimal:

De tal forma que,


19.562510 = 10011.10012 = 1,00111001 ∗ 24 = 4033𝐴00000000000𝐶𝐹𝐿(𝑃𝑅𝐸𝐶𝐼𝑆𝐼Ó𝑁 𝐷𝑂𝐵𝐿𝐸)

Valores de especial cuidado en la norma IEEE-754

Para el caso concreto de la precisión simple, hay cinco rangos numéricos que son imposibles
de representar.

1. Números negativos menores que -(2-2-23)*2127. Producen un desbordamiento negativo.


2. Números negativos mayores que −2−126. Producen un desbordamiento por abajo.
3. El número cero
4. Números positivos menores que 2−126. Producen un desbordamiento por abajo.
5. Números positivos mayores que (2-2-23)*2127. Producen un desbordamiento positivo.

Fuente: http://steve.hollasch.net/cgindex/coding/ieeefloat.html

El número cero no puede ser representado con este esquema debido a la utilización de la
técnica del bit escondido. Para solventar este problema se le asigna un código especial en el
que tanto la mantisa como el exponente tienen todos sus bits a cero y el bit de signo es
indeterminado (con lo que el cero tiene dos posibles representaciones).

Otros dos valores a los que se les asigna un código especial son +∞ y -∞ que se codifican con el
pertinente bit de signo, el exponente con todo unos y la mantisa con todo ceros.
Otro caso especial a considerar con esta codificación es cuando se produce un resultado que
es imposible de representar. Para esta situación se utiliza la notación “NaN” (acrónimo de Not
a Number). Estos valores a su vez se dividen en dos categorías dependiendo si el resultado es
indeterminado o inválido y se denotan respectivamente por los símbolos “QNaN” y “SNaN”. En
ambos casos el exponente tiene todos sus bits a uno y la mantisa es diferente de cero. El valor
de la mantisa se utiliza para distinguir entre las dos posibles situaciones.

Fuente: https://en.wikipedia.org/wiki/Extended_precision

Precisión Bytes bits


Simple 4 32
Doble 8 64
Extendida >= 10 >= 80
Cuádruple 16 128

Rangos de valores en representación con el estándar IEEE-754

Los rangos de representación en el estándar IEEE 754 con precisión simple y doble, exponente
en exceso a 2n-1-1 y mantisa en signo magnitud con bit implícito, son los siguientes:
((2−23 − 2) ∗ 2127 )10 = 2−24 − 2128 ≤ 𝑥 ≤ ((2 − 2−23 ) ∗ 2127 )10 = 2128 − 2104

1.17549𝑒 − 38 ≤ 𝑥 ≤ 3.40282𝑒 + 38
Rango de representación en el estándar IEEE 754 con precisión simple – 32Bits

((2−52 − 2) ∗ 21023 ) ≤ 𝑥 ≤ ((2 − 2−52 ) ∗ 21023 )


10 10

2.22507𝑒 − 308 <= |𝑥| <= 1.79769𝑒 + 308


Rango de representación en el estándar IEEE 754 con precisión doble – 64Bits
3.37𝑒 − 4932 <= |𝑥| <= 1.18𝑒4932
Rango de representación en el estándar IEEE 754 con doble extendida – 80Bits

Casos especiales en el Estándar IEEE 754


Tanto en precisión doble como en precisión simple, existen algunos casos especiales que
dependen de los valores del signo, del exponente y de la mantisa:

Figura - Casos especiales en el estándar IEEE 754 con precisión simple o doble

Los dos últimos casos merecen especial atención, ya que, cuando todos los bits del exponente
son ceros (00...0), esto quiere decir que no se está utilizando bit implícito. Si, además, la
mantisa es todo ceros (00...0), el número representado es el cero (0), pero si la mantisa es
distinta de todo ceros, el número que se está representando es muy pequeño, de forma que,
el exponente valdrá -126 ó -1022, dependiendo de si el número está escrito en precisión
simple o doble, respectivamente.

Cómo calcular el valor en base 10 de un número escrito en IEEE 754?

En las dos tablas siguientes se resumen los cálculos que hay que realizar para deducir el valor
en base 10 de un número escrito en el estándar IEEE 754 con precisión simple o doble.

Cálculo del valor en base 10 de un número escrito en IEEE 754 con precisión simple.

Cálculo del valor en base 10 de un número escrito en IEEE 754 con precisión doble.
Referencias Bibliográficas
1. Instituto de Ingenieros Eléctricos y Electrónicos (IEEE o
3
IE ): http://www.ieee.org/index.html
2. Grupo del IEEE sobre la norma 754: http://grouper.ieee.org/groups/754/
3. Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point
Arithmetic: http://www.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
4. Conversor entre decimal <–> IEEE754: http://www.h-schmidt.net/FloatConverter/
5. Conversor entre decimal <–> IEEE754:
http://users.minet.uni-jena.de/~sack/SS04/download/IEEE-754.html
6. http://es.wikipedia.org/wiki/Intel_8087
7. An Interview with the Old Man of Floating-Point
http://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html
8. Transparencias muy ilustrativas:
http://webdelprofesor.ula.ve/ingenieria/gilberto/paralela/09_AritmeticaPuntoFlotante.pdf.
9. http://www.h-schmidt.net/FloatConverter/IEEE754.html
10. http://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html
11. http://babbage.cs.qc.cuny.edu/IEEE-754/
12. http://www.zator.com/Cpp/E2_2_4a1.htm
13. http://www.carlospes.com/curso_representacion_datos/06_01_estandar_ieee_754.php

También podría gustarte