En informática , IEEE 754 es un estándar para aritmética de punto flotante desarrollado por el Instituto de Ingenieros Eléctricos y Electrónicos . Actualmente es el estándar más utilizado para calcular números de punto flotante con CPU y FPU . El estándar define los formatos para representar números de punto flotante ( signo , mantisa , exponente , números desnormalizados ) y valores especiales ( infinito y NaN ), junto con un conjunto de operaciones de punto flotante. También describe cinco modos de redondeo y cinco excepciones (incluidas las condiciones en las que se produce una excepción y lo que sucede en ese caso).
La versión original de IEEE 754, que data de 1985, definía cuatro formatos para representar números de punto flotante base 2:
Por ejemplo, en el lenguaje C , el compilador gcc para arquitecturas compatibles con Intel de 32 bits usa el formato precisión simple para variables de tipo float , precisión doble para variables de tipo doble y precisión doble o precisión doble extendida (siguiendo el sistema operativo) para variables dobles largas . Sin embargo, si no se utiliza la extensión SSE2 , todos los cálculos se redondean con la misma precisión, según la configuración de precisión dinámica del procesador (normalmente precisión doble o precisión doble extendida, según el sistema operativo, las opciones de compilación y los cambios realizados por programas).
El título completo del estándar era Estándar IEEE para aritmética binaria de coma flotante (ANSI / IEEE Std 754-1985 ). También se conoce con el nombre de IEC 60559: 1989, Aritmética de coma flotante binaria para sistemas de microprocesador , lo que también lo convierte en un estándar (americano), ya que fue aprobado como referencia normativa en varias normas internacionales ISO. Sin embargo, este estándar se extendió mediante una revisión importante en 2008 a otros formatos básicos (binario en 128 bits y decimales en 64 y 128 bits), así como formatos de intercambio (agregando formatos que son menos precisos o más precisos) y formatos extendidos ( generalización del estándar de 1985, con más libertad de precisión y codificación que con formatos de intercambio); esta revisión también incluye modos de redondeo adicionales y requisitos de conformidad más estrictos con respecto a la precisión esperada de los cálculos y operaciones de funciones trascendentales básicas. Esta norma también fue revisada en 2019.
En una palabra de longitud W, los bits se indexan de 0 a W - 1, inclusive. El bit 0 se coloca a la derecha y representa el bit menos significativo (es decir, el bit de unidades, que provocará la variación más pequeña si se cambia).
Un número de coma flotante se compone de tres elementos: la mantisa , el exponente y el signo. El bit más significativo es el bit de signo : si este bit está en 1, el número es negativo y si está en 0, el número es positivo. Los siguientes e bits representan el exponente sesgado (excepto el valor especial), y los siguientes m bits ( m bits menos significativos) representan la mantisa.
Signo | Exponente de sesgo | Mantisa |
(1 bit) | ( e bits) | ( m bits) |
El exponente puede ser positivo o negativo. Sin embargo, la representación habitual de números con signo ( complemento a 2 ) haría que la comparación entre números de coma flotante fuera un poco más difícil. Para resolver este problema, el exponente se "sesga" para almacenarlo como un número sin signo.
Este sesgo es 2 e −1 - 1 ( e representa el número de bits en el exponente); por lo tanto, es un valor constante una vez que se fija el número de bits e .
Por tanto, la interpretación de un número (que no sea infinito) es: valor = signo × mantisa × 2 ( exponente - sesgo ) con
El bit más significativo de la mantisa está determinado por el valor del exponente sesgado. Si el exponente sesgado es diferente de 0 y de , el bit más significativo de la mantisa es 1 y se dice que el número está "normalizado". Si el exponente sesgado es cero, el bit más significativo de la mantisa es cero y el número está desnormalizado .
Hay tres casos especiales:
Podemos resumirlo de la siguiente manera:
Tipo | Exponente de sesgo | Mantisa |
---|---|---|
Ceros | 0 | 0 |
Números desnormalizados | 0 | diferente de 0 |
Números normalizados | a | alguna |
Infinito | 0 | |
NaNs | diferente de 0 |
Un número de coma flotante de precisión simple se almacena en una palabra de 32 bits: 1 bit de signo, 8 bits para el exponente y 23 para la mantisa.
Por lo tanto, el exponente está sesgado por en este caso. Por tanto, el exponente de un número normalizado va de -126 a +127. El exponente -127 (que está sesgado hacia el valor 0) está reservado para cero y números desnormalizados, mientras que el exponente 128 (sesgado hacia 255) está reservado para codificar infinitos y NaN (consulte la tabla anterior).
Un número de coma flotante normalizado tiene un valor v dado por la siguiente fórmula:
v = s × 2 e × m .Por ejemplo, para 0b 0 01111100 01000000000000000000000: el signo es positivo, el exponente es 124-127 = −3 y la parte significativa es 0b 1.01, es decir, 1.25 en decimal (1 × 2 0 + 0 × 2 −1 + 1 × 2 - 2 ); el número representado es, por tanto, +1,25 × 2 −3 o +0,15625.
Los números desnormalizados siguen el mismo principio, excepto que e = −126 ym = 0+ mantisa (nota: para el cálculo, cuidaremos de tomar e = −126 y no −127, para garantizar la continuidad de esta representación con la representación normalizada, ya que m = 0+ mantisa y ya no m = 1+ mantisa ).
Notas:
Aquí hay una tabla que resume la parte anterior, con ejemplos de números de 32 bits de precisión simple.
Tipo | Expositor | Mantisa | Valor aproximado | Desviación / anterior |
---|---|---|---|---|
Cero | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0.0 | |
Número desnormalizado más pequeño | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 × 10 −45 | 1,4 × 10 −45 |
Siguiente número desnormalizado | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 × 10 −45 | 1,4 × 10 −45 |
Siguiente número desnormalizado | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 × 10 −45 | 1,4 × 10 −45 |
Otro número desnormalizado | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 × 10 −39 | |
Mayor número desnormalizado | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1,175 494 21 × 10 −38 | |
Número normalizado más pequeño | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1,175 494 35 × 10 −38 | 1,4 × 10 −45 |
Siguiente número estandarizado | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1,175 494 49 × 10 −38 | 1,4 × 10 −45 |
Casi el doble | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2.350 988 56 × 10 −38 | 1,4 × 10 −45 |
Siguiente número estandarizado | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2.350 988 70 × 10 −38 | 1,4 × 10 −45 |
Siguiente número estandarizado | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2.350 988 98 × 10 −38 | 2,8 × 10 −45 |
Casi 1 | 0111 1110 | 111 1111 1111 1111 1111 1111 | 0,999 999 94 | 0,6 × 10 −7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.000.000 00 | |
Siguiente número 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1.000.000 12 | 1,2 × 10 −7 |
Casi el mayor número | 1111 1110 | 111 1111 1111 1111 1111 1110 | 3.402 823 26 × 10 38 | |
Mayor número estandarizado | 1111 1110 | 111 1111 1111 1111 1111 1111 | 3.402 823 46 × 10 38 | 2 × 10 31 |
Infinito | 1111 1111 | 000 0000 0000 0000 0000 0000 | Infinito | |
Primer valor (desnormalizado) de la advertencia NaN | 1111 1111 | 000 0000 0000 0000 0000 0001 | no | |
NaN normalizado (alarma) | 1111 1111 | 010 0000 0000 0000 0000 0000 | no | |
Último valor (desnormalizado) de la advertencia NaN | 1111 1111 | 011 1111 1111 1111 1111 1111 | no | |
Primer valor (desnormalizado) de NaN silencioso | 1111 1111 | 100 0000 0000 0000 0000 0000 | no | |
Último valor (desnormalizado) de NaN silencioso | 1111 1111 | 111 1111 1111 1111 1111 1111 | no |
Notas:
Codifiquemos el número decimal −118,625 usando el mecanismo IEEE 754.
Por lo tanto, tenemos −118,625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
El formato de doble precisión es el mismo que el de precisión simple, excepto que los campos son más grandes. De hecho, tiene 52 bits de mantisa en lugar de solo 23 y 11 bits de exponente en lugar de solo 8.
La mantisa es muy amplia, mientras que el exponente no es muy amplio. Esto se debe a que, según los creadores del estándar, la precisión es más importante que la amplitud.
Los NaN y los infinitos se representan estableciendo todos los bits del exponente en 1 (2047), pero se distinguen estableciendo todos los 52 bits de la mantisa en 0 para los infinitos y al menos uno de estos 52 bits en 1 para el Nope. .
Para números normalizados, el sesgo del exponente es +1023. Para números desnormalizados, el exponente es −1022 (el exponente mínimo para un número normalizado). No es −1023 porque los números normalizados tienen un 1 antes del punto decimal y los números desnormalizados no. Como antes, el cero y el infinito están firmados.
Notas:
Por lo general, es mejor comparar números de punto flotante utilizando las instrucciones de cálculo de punto flotante. Sin embargo, esta representación hace posibles comparaciones de ciertos subconjuntos byte a byte, si tienen el mismo orden de bytes y el mismo signo, y los NaN están excluidos.
Por ejemplo, para dos números de coma flotante positivos a y b, la comparación entre a y b (>, <o ==) da los mismos resultados que la comparación de dos números con signo (o sin signo) con los mismos bits que a y B. En otras palabras, dos números de coma flotante positivos (que no son NaN) se pueden comparar con una comparación binaria con signo (o sin signo). Debido al problema del orden de bytes, esta comparación no se puede utilizar en código portátil.
El estándar IEEE especifica 5 modos de redondeo:
En junio 2008, IEEE ha aprobado una revisión importante de los estándares IEEE 754 e IEEE 854. Ver: IEEE 754-2008 (en) .
Esta revisión trae nuevos formatos base 2 y base 10, y especifica la representación de formatos base 10 (además de base 2).
También normaliza una relación de orden total para cada uno de los tipos de datos numéricos normalizados, complementando las relaciones de orden habituales que son sólo parciales; de hecho, la relación de orden normal es total solo con la condición de eliminar del conjunto de valores, el valor cero negativo (normalmente comparado como igual al valor cero positivo) y todos los valores de NaN (que no son ni iguales, ni superiores, ni inferior a cualquier otro, ni siquiera a ellos mismos).
Por otro lado, esta revisión deja la flexibilidad de representación y posible distinción de los valores de NaN (la posición y el valor de los bits de advertencia en el campo de mantisa no están estandarizados, y el uso de los otros bits de el campo de mantisa o el signo de un valor NaN para codificar un error sigue dependiendo de la arquitectura o las aplicaciones).
Se aprobó una nueva revisión en julio 2019.