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.


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:
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».
El número cero se representa de forma especial:
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).
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.
El infinito positivo y negativo se representa así:
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:

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.
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 |
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.
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. | ||||||
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.
La norma IEEE tiene cuatro modos de redondeo distintos; el primero es el predeterminado y los demás se llaman redondeos dirigidos.
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.
Deben proporcionarse las siguientes funciones:
NaN para cualquier x (incluido NaN).copysign(x,y) devuelve x con el signo de y, de modo que abs(x) es igual a copysign(x,1.0). Es una de las pocas operaciones que actúan sobre un NaN de forma parecida a la aritmética. La función copysign es nueva en la norma C99.scalb(y, N)logb(x)finite(x), un predicado para «x es un valor finito», equivalente a −Inf < x < Inf.isnan(x), un predicado para «x es un NaN», equivalente a «x ≠ x».x <> y (x .LG. y en Fortran), que resulta tener un comportamiento distinto de NOT(x = y) (x .NE. y en Fortran, x != y en C) debido a los NaN.unordered(x, y) es verdadero cuando «x no está ordenado respecto a y», es decir, cuando x o y es un NaN.class(x)nextafter(x,y) devuelve el siguiente valor representable a partir de x en la dirección de y.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.

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.