Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2017 - 02 - 19 - Estándar IEEE 754 - Punto - Flotante
2017 - 02 - 19 - Estándar IEEE 754 - Punto - Flotante
Punto Flotante
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
Ha día de hoy se considera el estándar de facto en todos los ordenadores personales. Pero,
¿cómo funciona exactamente?.
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,...,2n1 1,2n1 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.
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 n1 n1
,2 1,...,2,1,0,1,2,...,2n1 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 n1
1* 2n1 , y el
orden es el usual, o sea,
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:
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 * 21 ) (d3 * 22 ) ... (dn * 2n1 )
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 * 21 ) (d4 * 22 ) ... (dn * 2n2 )
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 2Fk1 y Fk frac(2Fk1 )
7
Ejemplo: Sea la fracción . Represéntala como una fracción binaria.
10
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
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:
S Exponente=E Mantisa=M
1 E=8 Bit M=23 Bit
32 bits - 4 Bytes
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
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.
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 ]∄ℝ.
−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
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
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,
8 0 5 c 0 0 0 0
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.
Es decir el rango de valores que se puede almacenar en una variable que ha sido declarada de
tipo double en lenguaje C es:
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
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
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:
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:
Para el caso concreto de la precisión simple, hay cinco rangos numéricos que son imposibles
de representar.
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
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
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.
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