IEEE 754-1985

IEEE 754-1985 es una norma histórica de la industria para representar números en coma flotante en computadoras, adoptada oficialmente en 1985 y sustituida en 2008 por IEEE 754-2008 y, de nuevo, en 2019 por la revisión menor IEEE 754-2019. Durante sus 23 años de vigencia fue el formato más usado para el cálculo en coma flotante. Se implementó en software, en forma de bibliotecas de coma flotante, y en hardware, en las instrucciones de muchas CPU y FPU. El Intel 8087 fue un circuito integrado que implementó el borrador de lo que se convertiría en la IEEE 754-1985.

La IEEE 754-1985 representa los números en binario y define cuatro niveles de precisión, de los cuales los dos más usados son:

Nivel Ancho Rango con precisión completa Precisión
Precisión simple 32 bits ±1,18×10−38 a ±3,4×1038 Unos 7 dígitos decimales
Precisión doble 64 bits ±2,23×10−308 a ±1,80×10308 Unos 16 dígitos decimales

La norma también define representaciones para el infinito positivo y negativo, un «cero negativo», cinco excepciones para tratar resultados no válidos como la división por cero, valores especiales llamados NaN para representar esas excepciones, números desnormalizados para representar números más pequeños que los indicados arriba y cuatro modos de redondeo.

Representación de los números

El número 0,15625 representado como número en coma flotante de precisión simple según la IEEE 754-1985. La explicación está en el texto.
Los tres campos de un número en coma flotante IEEE 754 de 64 bits.

Los números en coma flotante en formato IEEE 754 constan de tres campos: un bit de signo, un exponente sesgado y una fracción. El ejemplo siguiente ilustra el significado de cada uno.

El número decimal 0,1562510 se representa en binario como 0,001012 (es decir, 1/8 + 1/32). (Los subíndices indican la base del número). De forma análoga a la notación científica, en la que los números se escriben con un único dígito distinto de cero a la izquierda de la coma decimal, se reescribe este número para que tenga un único bit 1 a la izquierda de la «coma binaria». Basta con multiplicar por la potencia de 2 adecuada para compensar el desplazamiento de los bits tres posiciones a la izquierda:

Ahora pueden leerse la fracción y el exponente: la fracción es ,012 y el exponente es −3.

Como se ve en las imágenes, los tres campos de la representación IEEE 754 de este número son:

signo = 0, porque el número es positivo (1 indica negativo).
exponente sesgado = −3 + el «sesgo». En precisión simple el sesgo es 127, por lo que en este ejemplo el exponente sesgado es 124; en precisión doble el sesgo es 1023, por lo que el exponente sesgado en este ejemplo es 1020.
fracción = ,01000…2.

La IEEE 754 añade un sesgo al exponente para que, en muchos casos, los números puedan compararse cómodamente con el mismo hardware que compara enteros con signo en complemento a dos. Con un exponente sesgado, el menor de dos números positivos en coma flotante resulta «menor que» el mayor siguiendo el mismo orden que los enteros en signo y magnitud. Si dos números en coma flotante tienen signos distintos, la comparación en signo y magnitud también funciona con exponentes sesgados. Sin embargo, si ambos números son negativos, el orden debe invertirse. Si el exponente se representara, por ejemplo, como un número en complemento a dos, la comparación para ver cuál de dos números es mayor no sería tan cómoda.

El bit 1 inicial se omite, ya que todos los números salvo el cero empiezan por un 1; este 1 inicial es implícito y no necesita almacenarse, lo que da un bit adicional de precisión «gratis».

Cero

El número cero se representa de forma especial:

signo = 0 para el cero positivo, 1 para el cero negativo.
exponente sesgado = 0.
fracción = 0.

Números desnormalizados

Las representaciones descritas hasta aquí se llaman normalizadas, lo que significa que el dígito binario inicial implícito es un 1. Para reducir la pérdida de precisión cuando se produce un subdesbordamiento (underflow), la IEEE 754 permite representar fracciones más pequeñas que las posibles en la representación normalizada, haciendo que el dígito inicial implícito sea un 0. Estos números se llaman desnormalizados. No tienen tantas cifras significativas como un número normalizado, pero permiten una pérdida gradual de precisión cuando el resultado de una operación no es exactamente cero pero está demasiado cerca de cero para representarse con un número normalizado.

Un número desnormalizado se representa con un exponente sesgado formado solo por bits 0, que representa un exponente de −126 en precisión simple (no −127) o de −1022 en precisión doble (no −1023). En cambio, el menor exponente sesgado que representa un número normal es 1 (véanse los ejemplos más abajo).

Representación de lo que no son números

El campo del exponente sesgado se llena con bits 1 para indicar o bien infinito o bien un resultado no válido de un cálculo.

Infinito positivo y negativo

El infinito positivo y negativo se representa así:

signo = 0 para el infinito positivo, 1 para el infinito negativo.
exponente sesgado = todos los bits a 1.
fracción = todos los bits a 0.

NaN

Algunas operaciones de la aritmética en coma flotante no son válidas, como calcular la raíz cuadrada de un número negativo. Llegar a un resultado no válido se denomina excepción de coma flotante. Un resultado excepcional se representa con un código especial llamado NaN, de «Not a Number» ('no es un número'). Todos los NaN de la IEEE 754-1985 tienen este formato:

signo = 0 o 1.
exponente sesgado = todos los bits a 1.
fracción = cualquier valor salvo todos los bits a 0 (ya que todos los bits a 0 representan infinito).

Rango y precisión

Precisión relativa de los números de precisión simple (binary32) y doble (binary64), comparada con representaciones decimales que usan un número fijo de cifras significativas. Aquí la precisión relativa se define como ulp(x)/x, donde ulp(x) es la unidad en el último lugar de la representación de x, es decir, la distancia entre x y el siguiente número representable.

Precisión simple

Los números de precisión simple ocupan 32 bits. En precisión simple:

Algunos valores de ejemplo del rango y de la distancia entre números para exponentes dados en precisión simple:

Exponente real (sin sesgo) Exp. (sesgado) Mínimo Máximo Distancia
−1 126 0,5 ≈ 0,999999940395 ≈ 5,96046e-8
0 127 1 ≈ 1,999999880791 ≈ 1,19209e-7
1 128 2 ≈ 3,999999761581 ≈ 2,38419e-7
2 129 4 ≈ 7,999999523163 ≈ 4,76837e-7
10 137 1024 ≈ 2047,999877930 ≈ 1,22070e-4
11 138 2048 ≈ 4095,999755859 ≈ 2,44141e-4
23 150 8388608 16777215 1
24 151 16777216 33554430 2
127 254 ≈ 1,70141e38 ≈ 3,40282e38 ≈ 2,02824e31

Por ejemplo, 16 777 217 no puede codificarse como número en coma flotante de 32 bits, ya que se redondea a 16 777 216. En cambio, todos los enteros dentro del rango representable que son potencias de 2 pueden almacenarse en un número en coma flotante de 32 bits sin redondeo.

Precisión doble

Los números de precisión doble ocupan 64 bits. En precisión doble:

Algunos valores de ejemplo del rango y de la distancia entre números para exponentes dados en precisión doble:

Exponente real (sin sesgo) Exp. (sesgado) Mínimo Máximo Distancia
−1 1022 0,5 ≈ 0,999999999999999888978 ≈ 1,11022e-16
0 1023 1 ≈ 1,999999999999999777955 ≈ 2,22045e-16
1 1024 2 ≈ 3,999999999999999555911 ≈ 4,44089e-16
2 1025 4 ≈ 7,999999999999999111822 ≈ 8,88178e-16
10 1033 1024 ≈ 2047,999999999999772626 ≈ 2,27374e-13
11 1034 2048 ≈ 4095,999999999999545253 ≈ 4,54747e-13
52 1075 4503599627370496 9007199254740991 1
53 1076 9007199254740992 18014398509481982 2
1023 2046 ≈ 8,98847e307 ≈ 1,79769e308 ≈ 1,99584e292

Formatos extendidos

La norma también recomienda uno o varios formatos extendidos para realizar los cálculos internos con una precisión mayor que la necesaria para el resultado final, con el fin de reducir los errores de redondeo; la norma solo especifica los requisitos mínimos de precisión y de exponente de esos formatos. El formato extendido de 80 bits del x87 es el formato extendido más implementado que cumple estos requisitos.

Ejemplos

Estos son algunos ejemplos de representaciones IEEE 754 de precisión simple:

Tipo Signo Exponente real Exp. (sesgado) Campo del exponente Campo de la fracción Valor
Cero 0 −126 0 0000 0000 000 0000 0000 0000 0000 0000 0,0
Cero negativo 1 −126 0 0000 0000 000 0000 0000 0000 0000 0000 −0,0
Uno 0 0 127 0111 1111 000 0000 0000 0000 0000 0000 1,0
Menos uno 1 0 127 0111 1111 000 0000 0000 0000 0000 0000 −1,0
Menor número desnormalizado * −126 0 0000 0000 000 0000 0000 0000 0000 0001 ±2−23 × 2−126 = ±2−149 ≈ ±1,4×10−45
Número desnormalizado «intermedio» * −126 0 0000 0000 100 0000 0000 0000 0000 0000 ±2−1 × 2−126 = ±2−127 ≈ ±5,88×10−39
Mayor número desnormalizado * −126 0 0000 0000 111 1111 1111 1111 1111 1111 ±(1−2−23) × 2−126 ≈ ±1,18×10−38
Menor número normalizado * −126 1 0000 0001 000 0000 0000 0000 0000 0000 ±2−126 ≈ ±1,18×10−38
Mayor número normalizado * 127 254 1111 1110 111 1111 1111 1111 1111 1111 ±(2−2−23) × 2127 ≈ ±3,4×1038
Infinito positivo 0 128 255 1111 1111 000 0000 0000 0000 0000 0000 +∞
Infinito negativo 1 128 255 1111 1111 000 0000 0000 0000 0000 0000 −∞
NaN * 128 255 1111 1111 distinto de cero NaN
* El bit de signo puede ser 0 o 1.

Comparación de números en coma flotante

Cada combinación posible de bits es o bien un NaN o bien un número con un valor único en la recta real extendida con su orden asociado, salvo las dos combinaciones de bits del cero negativo y el cero positivo, que a veces requieren una atención especial (véase más abajo). La representación binaria tiene la propiedad especial de que, excluidos los NaN, dos números cualesquiera pueden compararse como enteros en signo y magnitud (con las salvedades de endianness). Al compararlos como enteros en complemento a dos: si los bits de signo son distintos, el número negativo precede al positivo, por lo que el complemento a dos da el resultado correcto (salvo que el cero negativo y el positivo deben considerarse iguales). Si ambos valores son positivos, la comparación en complemento a dos también da el resultado correcto. En otro caso (dos números negativos), el orden correcto en coma flotante es el inverso del orden en complemento a dos.

Los errores de redondeo inherentes a los cálculos en coma flotante pueden limitar el uso de comparaciones para comprobar la igualdad exacta de resultados. Elegir un margen aceptable es una cuestión compleja. Una técnica habitual es usar un valor épsilon de comparación para hacer comparaciones aproximadas. Según la tolerancia de las comparaciones, se usan valores como 1e-6 o 1e-5 para precisión simple y 1e-14 para precisión doble. Otra técnica habitual es la de las ULP, que comprueba la diferencia en los dígitos del último lugar, es decir, a cuántos pasos de distancia están los dos valores.

Aunque el cero negativo y el positivo suelen considerarse iguales a efectos de comparación, algunos operadores relacionales de lenguajes de programación y construcciones similares los tratan como distintos. Según la especificación del lenguaje Java, los operadores de comparación y de igualdad los tratan como iguales, pero Math.min() y Math.max() los distinguen, al igual que los métodos de comparación equals(), compareTo() e incluso compare() de las clases Float y Double.

Redondeo de números en coma flotante

La norma IEEE tiene cuatro modos de redondeo distintos; el primero es el predeterminado y los demás se llaman redondeos dirigidos.

Extensión de los números reales

La norma IEEE emplea (y amplía) la recta real extendida afín, con infinitos positivo y negativo separados. Durante su redacción se propuso que la norma incorporara la recta real proyectivamente extendida, con un único infinito sin signo, ofreciendo a los programadores la opción de elegir el modo. Sin embargo, el modo proyectivo se eliminó para reducir la complejidad de la norma final. Los coprocesadores de coma flotante Intel 8087 e Intel 80287 conservan un vestigio de este modo proyectivo.

Funciones y predicados

Operaciones estándar

Deben proporcionarse las siguientes funciones:

Funciones y predicados recomendados

Historia

En 1976, Intel empezaba a desarrollar un coprocesador de coma flotante. Intel esperaba vender un chip que contuviera la mayor parte de lo esencial de una biblioteca matemática.

John Palmer, que dirigía el proyecto, consideraba que el trabajo debía apoyarse en una norma que unificara las operaciones en coma flotante de los distintos procesadores de Intel. Recurrió a William Kahan, de la Universidad de California, que había ayudado a mejorar la precisión de las calculadoras de Hewlett-Packard. Kahan propuso que Intel usara la coma flotante del VAX de Digital Equipment Corporation (DEC), que era muy buena para su época. Sin embargo, como quería vender su chip al mercado más amplio posible, Intel deseaba la mejor coma flotante posible, y Kahan se dedicó a definirla.

El trabajo de Intel preocupó a otros fabricantes, que pusieron en marcha un esfuerzo de normalización para garantizar la igualdad de condiciones. Kahan asistió a la segunda reunión del grupo de trabajo de la norma IEEE 754, celebrada en noviembre de 1977. Después obtuvo permiso de Intel para presentar una propuesta de borrador basada en su trabajo para el coprocesador; se le permitió explicar los detalles del formato y sus fundamentos, pero nada relacionado con la arquitectura de la implementación de Intel. El borrador lo escribió junto con Jerome Coonen y Harold Stone, y al principio se conoció como «propuesta Kahan-Coonen-Stone» o «formato K-C-S».

Como un exponente de 8 bits no era lo bastante amplio para algunos cálculos de doble precisión, tanto la propuesta de Kahan como una contrapropuesta de DEC usaron 11 bits, como el formato de coma flotante de 60 bits, ya probado, de la CDC 6600. La propuesta de Kahan también preveía infinitos, útiles para tratar las divisiones por cero; valores NaN, útiles para tratar las operaciones no válidas; números desnormalizados, que ayudan a mitigar los problemas causados por el subdesbordamiento, y un sesgo del exponente mejor equilibrado.

Incluso antes de su aprobación, varios fabricantes ya habían implementado el borrador de la norma. El Intel 8087, lanzado en 1980, implementaba el borrador de la norma.

Coprocesador de coma flotante Intel 8087.

En 1980 el chip Intel 8087 ya había salido al mercado, pero DEC seguía oponiéndose, en particular a los números desnormalizados, por motivos de rendimiento y porque proponía que se adoptara su propio formato.

Las discusiones sobre el subdesbordamiento gradual duraron hasta 1981, cuando un experto contratado por DEC para evaluarlo se puso del lado contrario a los disidentes. DEC había encargado el estudio para demostrar que el subdesbordamiento gradual era una mala idea, pero el estudio concluyó lo contrario y DEC cedió. En 1985 se ratificó la norma, pero ya se había convertido en norma de facto un año antes, implementada por muchos fabricantes.

Véase también

Notas

  1. ↑ Precisión: el número de dígitos decimales de precisión se calcula como número_de_bits_de_mantisa × log10(2). Así resultan unos 7,2 y 15,9 para la precisión simple y la doble, respectivamente.

Referencias

  1. ↑ IEEE Standard for Binary Floating-Point Arithmetic [Norma IEEE para la aritmética binaria en coma flotante]. 1985. ISBN 0-7381-1165-1. doi:10.1109/IEEESTD.1985.82928.
  2. ↑ «754-1985 - IEEE Standard for Binary Floating-Point Arithmetic» [754-1985 - Norma IEEE para la aritmética binaria en coma flotante]. IEEE Standards Association. Consultado el 30 de octubre de 2026.
  3. ↑ «ANSI/IEEE Std 754-2019» [Norma ANSI/IEEE 754-2019]. 754r.ucbtest.org. Consultado el 6 de agosto de 2019.
  4. 1 2 William Kahan. «Why do we need a floating-point arithmetic standard?» [¿Por qué necesitamos una norma de aritmética en coma flotante?]. people.eecs.berkeley.edu. p. 5. Consultado el 30 de octubre de 2026.
  5. 1 2 David Goldberg. «What Every Computer Scientist Should Know About Floating-Point Arithmetic» [Lo que todo informático debería saber sobre la aritmética en coma flotante]. Oracle. sección «Precision». Consultado el 30 de octubre de 2026.
  6. ↑ David Goldberg. «What Every Computer Scientist Should Know About Floating-Point Arithmetic» [Lo que todo informático debería saber sobre la aritmética en coma flotante]. Oracle. secciones «Exceptions, Flags and Trap Handlers» y «Flags». Consultado el 30 de octubre de 2026.
  7. 1 2 William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 1–2. Consultado el 30 de octubre de 2026.
  8. 1 2 3 4 5 6 7 8 9 William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 3. Consultado el 30 de octubre de 2026.
  9. 1 2 William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 2. Consultado el 30 de octubre de 2026.
  10. 1 2 William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 7. Consultado el 30 de octubre de 2026.
  11. 1 2 William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 4. Consultado el 30 de octubre de 2026.
  12. ↑ William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 4–5. Consultado el 30 de octubre de 2026.
  13. ↑ «Godot math_funcs.h». GitHub.com. Consultado el 30 de octubre de 2026.
  14. 1 2 «Comparing Floating Point Numbers, 2012 Edition» [Comparación de números en coma flotante, edición de 2012]. randomascii.wordpress.com. 25 de febrero de 2012. Consultado el 30 de octubre de 2026.
  15. ↑ «Godot math_defs.h». GitHub.com. Consultado el 30 de octubre de 2026.
  16. ↑ «Godot MathfEx.cs». GitHub.com. Consultado el 30 de octubre de 2026.
  17. ↑ «The Java Language Specification, Java SE 21 Edition. Chapter 15. Expressions» [Especificación del lenguaje Java, edición Java SE 21. Capítulo 15. Expresiones]. Oracle. §15.20.1 y §15.21.1. Consultado el 30 de octubre de 2026.
  18. ↑ «Math (Java SE 21 & JDK 21)». Oracle. Consultado el 30 de octubre de 2026.
  19. ↑ «Double (Java SE 21 & JDK 21)». Oracle. Consultado el 30 de octubre de 2026.
  20. ↑ «Float (Java SE 21 & JDK 21)». Oracle. Consultado el 30 de octubre de 2026.
  21. ↑ William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 18–19, 26. Consultado el 30 de octubre de 2026.
  22. 1 2 3 John R. Hauser (marzo de 1996). «Handling Floating-Point Exceptions in Numeric Programs» [El tratamiento de las excepciones de coma flotante en los programas numéricos]. ACM Transactions on Programming Languages and Systems 18 (2): 160. doi:10.1145/227699.227701.
  23. ↑ William Kahan. «Why do we need a floating-point arithmetic standard?» [¿Por qué necesitamos una norma de aritmética en coma flotante?]. people.eecs.berkeley.edu. p. 33. Consultado el 30 de octubre de 2026.
  24. 1 2 William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 8. Consultado el 30 de octubre de 2026.
  25. ↑ William Kahan (1 de octubre de 1997). «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» [Apuntes sobre el estado de la norma IEEE 754 para la aritmética binaria en coma flotante]. Universidad de California en Berkeley. p. 19. Consultado el 30 de octubre de 2026.
  26. ↑ ISO/IEC 9899:1999 - Programming languages - C [ISO/IEC 9899:1999 - Lenguajes de programación - C]. Iso.org. §7.12.14.
  27. 1 2 3 4 5 6 «Intel and Floating-Point: Updating One of the Industry's Most Successful Standards. The Technology Vision for the Floating-Point Standard» [Intel y la coma flotante: la actualización de una de las normas de mayor éxito de la industria]. Intel. 2016. p. 4. Archivado desde el original el 4 de marzo de 2016. Consultado el 30 de octubre de 2026.
  28. 1 2 3 4 5 6 7 8 9 10 11 12 Charles Severance (marzo de 1998). «IEEE 754: An Interview with William Kahan» [IEEE 754: una entrevista con William Kahan]. IEEE Computer 31 (3): 114-115. doi:10.1109/MC.1998.660194. Consultado el 30 de octubre de 2026.
  29. 1 2 3 «Intel and Floating-Point: Updating One of the Industry's Most Successful Standards. The Technology Vision for the Floating-Point Standard» [Intel y la coma flotante: la actualización de una de las normas de mayor éxito de la industria]. Intel. 2016. p. 5. Archivado desde el original el 4 de marzo de 2016. Consultado el 30 de octubre de 2026.
  30. 1 2 3 4 5 6 7 William Kahan (20 de febrero de 1998). «An Interview with the Old Man of Floating-Point» [Una entrevista con el padre de la coma flotante]. Universidad de California en Berkeley. Consultado el 30 de octubre de 2026.
  31. ↑ Thornton, James E. (1970). Design of a Computer: The Control Data 6600 [Diseño de una computadora: la Control Data 6600] (1 edición). Glenview (Illinois): Scott, Foresman and Company. p. 78. Consultado el 30 de octubre de 2026.
  32. ↑ William Kahan. «Why do we need a floating-point arithmetic standard?» [¿Por qué necesitamos una norma de aritmética en coma flotante?]. people.eecs.berkeley.edu. p. 31, 34. Consultado el 30 de octubre de 2026.
  33. ↑ William Kahan. «Names for Standardized Floating-Point Formats» [Nombres para los formatos de coma flotante normalizados]. people.eecs.berkeley.edu. p. 1. Consultado el 30 de octubre de 2026.
  34. ↑ «Intel and Floating-Point: Updating One of the Industry's Most Successful Standards. The Technology Vision for the Floating-Point Standard» [Intel y la coma flotante: la actualización de una de las normas de mayor éxito de la industria]. Intel. 2016. p. 6. Archivado desde el original el 4 de marzo de 2016. Consultado el 30 de octubre de 2026.
  35. 1 2 «Molecular Expressions: Olympus MIC-D Integrated Circuit Gallery - Intel 8087 Math Coprocessor» [Molecular Expressions: galería de circuitos integrados Olympus MIC-D - coprocesador matemático Intel 8087]. Universidad Estatal de Florida. Consultado el 30 de octubre de 2026.

Bibliografía adicional

Enlaces externos