Articulo de referencia

IEEE 754

El estándar IEEE para aritmética de punto flotante ( IEEE 754 ) es un estándar técnico para aritmética de punto flotante , establecido originalmente en 1985 por el Instituto de ...

El estándar IEEE para aritmética de punto flotante ( IEEE 754 ) es un estándar técnico para aritmética de punto flotante , establecido originalmente en 1985 por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). El estándar abordó muchos problemas presentes en las diversas implementaciones de punto flotante que dificultaban su uso fiable y portátil . Muchas unidades de hardware de punto flotante utilizan el estándar IEEE 754.

La norma define:

  • Formatos aritméticos: conjuntos de datos binarios y decimales de punto flotante, que consisten en números finitos (incluidos ceros con signo y números subnormales ), infinitos y valores especiales "no son números" ( NaN ).
  • formatos de intercambio: codificaciones (cadenas de bits) que pueden utilizarse para intercambiar datos de punto flotante de forma eficiente y compacta.
  • Reglas de redondeo: propiedades que deben cumplirse al redondear números durante operaciones aritméticas y conversiones.
  • Operaciones: operaciones aritméticas y otras operaciones (como funciones trigonométricas ) en formatos aritméticos.
  • Manejo de excepciones: indicaciones de condiciones excepcionales (como división por cero , desbordamiento, etc.).

La norma IEEE 754-2008 , publicada en agosto de 2008, incluye casi la totalidad de la norma original IEEE 754-1985 , además de la norma IEEE 854-1987 (aritmética de punto flotante independiente de la base).La versión actual, IEEE 754-2019, se publicó en julio de 2019. [ 1 ] Es una revisión menor de la versión anterior, que incorpora principalmente aclaraciones, correcciones de defectos y nuevas operaciones recomendadas.

Historia

La necesidad de un estándar de punto flotante surgió del caos reinante en la industria de la informática empresarial y científica durante las décadas de 1960 y 1970. IBM utilizaba un formato hexadecimal de punto flotante con siete bits siempre empleados para el exponente, independientemente de la precisión. Los ordenadores CDC y Cray empleaban la representación en complemento a uno , que admite valores de +0 y −0. Los ordenadores CDC de 60 bits no disponían de sumadores completos de 60 bits, por lo que la aritmética de enteros se limitaba a 48 bits de precisión de la unidad de punto flotante. El procesamiento de excepciones por división por cero variaba entre los distintos ordenadores. Transferir datos entre sistemas e incluso repetir los mismos cálculos en diferentes sistemas solía ser complicado.

El primer estándar IEEE para aritmética de punto flotante, IEEE 754-1985 , se publicó en 1985. Cubría únicamente la aritmética de punto flotante binaria.

En agosto de 2008 se publicó una nueva versión, la IEEE 754-2008 , tras un proceso de revisión de siete años presidido por Dan Zuras y editado por Mike Cowlishaw . Esta versión sustituyó a las normas IEEE 754-1985 (Aritmética de punto flotante binaria) e IEEE 854-1987 (Aritmética de punto flotante independiente de la base). La nueva norma incluye los formatos binarios de la norma original, junto con tres nuevos formatos básicos: uno binario y dos decimales. Para cumplir con la norma vigente, una implementación debe implementar al menos uno de los formatos básicos tanto como formato aritmético como formato de intercambio.

La norma internacional ISO/IEC/IEEE 60559:2011 (con contenido idéntico a la IEEE 754-2008) ha sido aprobada para su adopción a través de ISO / IEC JTC 1 /SC 25 bajo el Acuerdo ISO/IEEE PSDO [ 2 ] [ 3 ] y publicada. [ 4 ]

La versión actual, IEEE 754-2019, publicada en julio de 2019, deriva de la norma IEEE 754-2008 y la reemplaza, tras un proceso de revisión iniciado en septiembre de 2015, presidido por David G. Hough y editado por Mike Cowlishaw. Incorpora principalmente aclaraciones (p. ej., totalOrder ) y correcciones de errores (p. ej. , minNum ), pero también incluye algunas operaciones nuevas recomendadas (p. ej., augmentedAddition ). [ 5 ] [ 6 ]

La norma internacional ISO/IEC 60559:2020 (con contenido idéntico a la IEEE 754-2019) ha sido aprobada para su adopción por ISO/IEC JTC 1 /SC 25 y publicada. [ 7 ]

La próxima revisión prevista de la norma es en 2029. [ 8 ]

Formatos

IEEE 754 define un formato como "un conjunto de representaciones de valores numéricos y símbolos, posiblemente acompañadas de una codificación". [ 9 ]

Un formato de punto flotante se especifica mediante

  • una base (también llamada radix ) b , que es 2 (binario) o 10 (decimal) en IEEE 754;
  • una precisión p ;
  • un rango de exponentes de emin a emax , con emin = 1 − emax , o equivalentemente emin = − ( emax − 1), para todos los formatos IEEE 754.

Un formato comprende

  • Los números finitos, que pueden describirse mediante tres enteros: s  = un signo (cero o uno), c  = una mantisa (también llamada coeficiente o mantisa ) que no tiene más de p dígitos cuando se escribe en base b (es decir, un entero en el rango de 0 a b p  1), y q  = un exponente tal que eminq  + p − 1 ≤ emax . El valor numérico de dicho número finito es (−1) s × c × b q . [ a ] ​​Además, hay dos valores cero, llamados ceros con signo : el bit de signo especifica si un cero es +0 (cero positivo) o −0 (cero negativo).   
  • Dos infinitos: +∞ y −∞.
  • Dos tipos de NaN (no un número): un NaN silencioso (qNaN) y un NaN de señalización (sNaN).

Por ejemplo, si b = 10, p = 7 y emax = 96, entonces emin = −95, la mantisa satisface 0 ≤ c9 999 999 , y el exponente satisface −101 ≤ q ≤ 90 . En consecuencia, el número positivo no nulo más pequeño que se puede representar es 1×10 −101 , y el más grande es 9999999×10 90 (9.999999×10 96 ), por lo que el rango completo de números es −9.999999×10 96 a 9.999999×10 96 . Los números − b 1− emax y b 1− emax (aquí, −1×10 −95 y 1×10 −95 ) son los números normales más pequeños (en magnitud) ; los números no nulos entre estos números más pequeños se llaman números subnormales .

Representación y codificación en la memoria

Algunos números pueden tener varias representaciones posibles de punto flotante. Por ejemplo, si b  =  10 y p  =  7, entonces −12,345 se puede representar como −12345×10 −3 , −123450×10 −4 y −1234500×10 −5 . Sin embargo, para la mayoría de las operaciones, como las aritméticas, el resultado (valor) no depende de la representación de los datos de entrada.

Para los formatos decimales, cualquier representación es válida, y el conjunto de estas representaciones se denomina cohorte . Cuando un resultado puede tener varias representaciones, el estándar especifica qué miembro de la cohorte se elige.

Para los formatos binarios, la representación se hace única. La mayoría de los números de punto flotante, aquellos con un valor absoluto mayor que 2 emin , se denominan normales . Tienen una mantisa que está entre 1 (incluido) y 2 (excluido), que por lo tanto siempre tiene un bit 1 inicial; este bit no se almacena explícitamente en la representación, sino que se deja implícito; esta regla se denomina convención del bit inicial , convención del bit implícito o convención del bit oculto , y permite que el formato tenga un bit adicional de precisión. Al exponente de un número normal se le agrega un " sesgo ", y el exponente sesgado resultante siempre es un entero positivo. Los números menores que 2 emin se denominan números subnormales . Estos números se representan mediante el exponente sesgado 0, que representa emin . Para los números subnormales, ya no hay un bit 1 inicial implícito, y la mantisa se encuentra entre 0 y 1.

Debido a la posibilidad de múltiples codificaciones (al menos en formatos llamados formatos de intercambio ), un NaN puede contener otra información: un bit de signo (que no tiene significado, pero puede ser utilizado por algunas operaciones) y una carga útil , que está destinada a información de diagnóstico que indica la fuente del NaN (pero la carga útil puede tener otros usos, como el NaN-boxing [ 10 ] [ 11 ] [ 12 ] ).

Formatos básicos e intercambiables

El estándar define cinco formatos básicos que reciben su nombre de su base numérica y del número de bits utilizados en su codificación de intercambio. Existen tres formatos básicos binarios de punto flotante (codificados con 32, 64 o 128 bits) y dos formatos básicos decimales de punto flotante (codificados con 64 o 128 bits). Los formatos binary32 y binary64 corresponden a los formatos simple y doble de la norma IEEE 754-1985 , respectivamente. Una implementación conforme debe implementar completamente al menos uno de los formatos básicos.

El estándar especifica formatos de intercambio con un rango de anchos, incluidos los formatos básicos, para admitir el intercambio de datos de punto flotante entre implementaciones. Los tamaños de los campos de exponente y mantisa para cada ancho se determinan mediante reglas definidas en función del ancho. [ 13 ] La siguiente tabla resume algunos de los posibles formatos de intercambio (incluidos los formatos básicos).

En la tabla anterior, los valores enteros son exactos, mientras que los valores en notación decimal (por ejemplo, 1.0) son valores redondeados. Los exponentes mínimos enumerados son para números normales; la representación especial de números subnormales permite representar números aún más pequeños (en magnitud) con cierta pérdida de precisión. Por ejemplo, el número positivo más pequeño que se puede representar en binary64 es 2 −1074 ; las contribuciones a la cifra de −1074 incluyen el valor emin −1022 y todos menos uno de los 53 bits de mantisa (2 −1022   (53   1)  =  2 −1074 ).

La precisión del formato se expresa en términos de un número equivalente de dígitos decimales. Se calcula multiplicando el número de dígitos por el logaritmo en base 10. Por ejemplo, el formato binario 128 tiene aproximadamente la misma precisión que un número decimal de 34 dígitos.

log 10 MAXVAL es una medida del rango de la codificación. Su parte entera es el exponente más grande que se muestra en la salida de un valor en notación científica con un dígito principal en la mantisa antes del punto decimal (por ejemplo, 1,698 × 10 38 está cerca del valor más grande en binary32, 9.999999 × 1096 es el valor más grande en decimal32).

Los formatos binary32 (simple) y binary64 (doble) son dos de los más comunes en la actualidad. La siguiente figura muestra la precisión absoluta de ambos formatos en un rango de valores. Esta figura permite seleccionar el formato adecuado según el valor esperado de un número y la precisión requerida.

Precisión de binary32 y binary64 en el rango de 10 −12 a 10 12

Un ejemplo de diseño para punto flotante de 32 bits es

y la disposición de 64 bits es similar.

Formatos de precisión ampliados y ampliables

El estándar especifica formatos de precisión extendida y extensible opcionales, que proporcionan mayor precisión que los formatos básicos. [ 14 ] Un formato de precisión extendida amplía un formato básico utilizando mayor precisión y mayor rango de exponente. Un formato de precisión extensible permite al usuario especificar la precisión y el rango de exponente. Una implementación puede utilizar la representación interna que elija para dichos formatos; lo único que necesita definirse son sus parámetros ( b , p y emax ). Estos parámetros describen de forma única el conjunto de números finitos (combinaciones de signo, mantisa y exponente para la base dada) que puede representar.

El estándar recomienda que los estándares de lenguaje proporcionen un método para especificar p y emax para cada base b admitida . [ 15 ] El estándar recomienda que los estándares e implementaciones de lenguaje admitan un formato extendido que tenga una precisión mayor que el formato básico más grande admitido para cada base b . [ 16 ] Para un formato extendido con una precisión entre dos formatos básicos, el rango del exponente debe ser tan grande como el del siguiente formato básico más amplio. Así, por ejemplo, un número binario de precisión extendida de 64 bits debe tener un 'emax' de al menos 16383. El formato extendido de 80 bits de x87 cumple este requisito.

El estándar original IEEE 754-1985 también tenía el concepto de formatos extendidos , pero sin ninguna relación obligatoria entre emin y emax . Por ejemplo, el formato de 80 bits Motorola 68881 , [ 17 ] donde emin = − emax , era un formato extendido conforme, pero se convirtió en no conforme en la revisión de 2008.

Formatos de intercambio

Los formatos de intercambio están diseñados para el intercambio de datos de punto flotante mediante una cadena de bits de longitud fija para un formato determinado.

Binario

Para el intercambio de números binarios de punto flotante, se definen formatos de intercambio de 16 bits, 32 bits, 64 bits y cualquier múltiplo de 32 bits ≥ 128 [ e ] . El formato de 16 bits está pensado para el intercambio o almacenamiento de números pequeños (por ejemplo, para gráficos).

El esquema de codificación para estos formatos de intercambio binario es el mismo que el de IEEE 754-1985: un bit de signo, seguido de w bits de exponente que describen el exponente desplazado por un sesgo , y p  1 bits que describen la mantisa. El ancho del campo del exponente para un formato de k bits se calcula como w  =  round(4  log 2 ( k ))   13. Los formatos existentes de 64 y 128 bits siguen esta regla, pero los formatos de 16 y 32 bits tienen más bits de exponente (5 y 8 respectivamente) de los que proporcionaría esta fórmula (3 y 7 respectivamente).

Al igual que en IEEE 754-1985, el campo del exponente sesgado se llena con todos los bits 1 para indicar infinito (campo de mantisa final = 0) o un NaN (campo de mantisa final ≠ 0). Para los NaN, los NaN silenciosos y los NaN de señalización se distinguen utilizando exclusivamente el bit más significativo del campo de mantisa final, [ f ] , y la carga útil se transporta en los bits restantes.

Decimal

Para el intercambio de números decimales de punto flotante, se definen formatos de intercambio para cualquier múltiplo de 32 bits. Al igual que en el intercambio binario, el esquema de codificación para los formatos de intercambio decimal codifica el signo, el exponente y la mantisa. Se definen dos codificaciones diferentes a nivel de bits, y el intercambio se complica debido a que puede requerirse algún indicador externo de la codificación utilizada.

Las dos opciones permiten codificar la mantisa como una secuencia comprimida de dígitos decimales mediante el sistema de codificación decimal densamente empaquetado o, alternativamente, como un entero binario . La primera opción es más conveniente para la implementación directa del estándar en hardware, mientras que la segunda se adapta mejor a la emulación por software en un ordenador binario. En ambos casos, el conjunto de números (combinaciones de signo, mantisa y exponente) que se pueden codificar es idéntico, y los valores especiales (±cero con el exponente mínimo, ±infinito, NaN silenciosos y NaN de señalización) tienen codificaciones idénticas.

Reglas de redondeo

La norma define cinco reglas de redondeo. Las dos primeras reglas redondean al valor más cercano; las demás se denominan redondeos dirigidos :

Redondeo al número más cercano

En los extremos, un valor con una magnitud estrictamente menor quek=bemax(b12b1pag){\displaystyle k=b^{\text{emax}}\left(b-{\tfrac {1}{2}}b^{1-p}\right)}se redondeará al número finito mínimo o máximo (dependiendo del signo del valor). Cualquier número con exactamente esta magnitud se considera un empate; esta elección de empate puede conceptualizarse como el punto medio entre±bemax(bb1pag){\displaystyle \pm b^{\text{emax}}(bb^{1-p})}y±bemax+1{\displaystyle \pm b^{{\text{emax}}+1}}, que, si el exponente no estuviera limitado, serían los siguientes números de coma flotante representables de mayor magnitud. Los números con una magnitud estrictamente mayor que k se redondean al infinito correspondiente. [ 18 ]

"Redondear al más cercano, empates al par" es la opción predeterminada para coma flotante binaria y la opción recomendada para decimal. "Redondear al más cercano, empates al opuesto" solo es necesario para implementaciones decimales. [ 19 ]

Rondas dirigidas

  • Redondeo hacia 0  : redondeo dirigido hacia cero (también conocido como truncamiento ).
  • Redondeo hacia +∞  : redondeo dirigido hacia el infinito positivo (también conocido como redondeo hacia arriba o hacia el techo ).
  • Redondeo hacia −∞  : redondeo dirigido hacia el infinito negativo (también conocido como redondeo hacia abajo o redondeo hacia el piso ).

Salvo que se especifique lo contrario, el resultado de punto flotante de una operación se determina aplicando la función de redondeo al resultado (matemático) de precisión infinita. Se dice que dicha operación está correctamente redondeada . Este requisito se denomina redondeo correcto . [ 20 ]

Operaciones requeridas

Las operaciones requeridas para un formato aritmético compatible (incluidos los formatos básicos) incluyen:

  • Conversiones a y desde enteros [ 21 ] [ 22 ]
  • Valores consecutivos anterior y siguiente [ 21 ]
  • Operaciones aritméticas (suma, resta, multiplicación, división, raíz cuadrada, multiplicación-suma combinada , resto, mínimo, máximo) [ 21 ] [ 22 ]
  • Conversiones (entre formatos, hacia y desde cadenas, etc.) [ 23 ] [ 24 ]
  • Escalado y (para decimal) cuantización [ 25 ] [ 26 ]
  • Copiar y manipular el signo (abs, negación, etc.) [ 27 ]
  • Comparaciones y ordenación total [ 28 ] [ 29 ]
  • Clasificación de números (subnormales, finitos, etc.) y prueba de NaN [ 30 ]
  • Prueba y configuración de indicadores de estado [ 31 ]

predicados de comparación

El estándar proporciona predicados de comparación para comparar un dato de punto flotante con otro en el formato aritmético admitido. [ 32 ] Cualquier comparación con un NaN se trata como no ordenada. −0 y +0 se comparan como iguales.

Predicado de ordenación total

El estándar proporciona un predicado totalOrder , que define un orden total en los miembros canónicos del formato aritmético admitido. [ 33 ] El predicado coincide con los predicados de comparación (véase la sección §  Predicados de comparación ) cuando un número de punto flotante es menor que el otro. Las principales diferencias son: [ 34 ]

  • NaN es ordenable.
    • NaN se trata como si tuviera un valor absoluto mayor que Infinito (o cualquier otro número de coma flotante). (−NaN < −Infinito; +Infinito < +NaN).
    • qNaN y sNaN se tratan como si qNaN tuviera un valor absoluto mayor que sNaN. (−qNaN < −sNaN; +sNaN < +qNaN.)
    • Los valores NaN se ordenan según su carga útil. En la norma IEEE 754-2008, un valor NaN con una carga útil menor se considera de menor valor absoluto. En la norma IEEE 754-2019, se acepta cualquier ordenación definida por la implementación.
  • El cero negativo se considera menor que el cero positivo.
  • Si ambos lados de la comparación se refieren al mismo dato de punto flotante, se considera que el que tiene el exponente menor tiene un valor absoluto menor. [ 33 ]

El predicado totalOrder no impone un orden total a todas las codificaciones en un formato. En particular, no distingue entre diferentes codificaciones de la misma representación de punto flotante, como cuando una o ambas codificaciones no son canónicas. [ 33 ] IEEE 754-2019 incorpora aclaraciones sobre totalOrder .

Para los formatos de intercambio binario cuya codificación sigue la recomendación IEEE 754-2008 sobre la ubicación del bit de señalización NaN , la comparación es idéntica a una que convierte los números de punto flotante a un entero de magnitud de signo (suponiendo un orden de carga útil consistente con esta comparación), un viejo truco para la comparación de FP sin una FPU. [ 35 ]

Manejo de excepciones

El estándar define cinco excepciones, cada una de las cuales devuelve un valor predeterminado y tiene un indicador de estado correspondiente que se activa cuando ocurre la excepción. [ g ] No se requiere ningún otro manejo de excepciones, pero se recomiendan alternativas adicionales que no sean predeterminadas (ver §  Manejo alternativo de excepciones ).

Las cinco posibles excepciones son

Operación no válida
matemáticamente indefinido, por ejemplo, la raíz cuadrada de un número negativo. Por defecto, devuelve qNaN.
División por cero
Una operación con operandos finitos da un resultado infinito exacto, por ejemplo, 1/0 o log(0). Por defecto, devuelve ±infinito.
Rebosar
Un resultado finito es demasiado grande para ser representado con precisión (es decir, su exponente con un rango de exponente ilimitado sería mayor que emax ). Por defecto, devuelve ±infinito para los modos de redondeo al más cercano (y sigue las reglas de redondeo para los modos de redondeo dirigido).
Flujo inferior
El resultado es muy pequeño (fuera del rango normal). Por defecto, devuelve un número menor o igual al mínimo número normal positivo en magnitud (siguiendo las reglas de redondeo); un número subnormal siempre implica una excepción de subdesbordamiento, pero por defecto, si es exacto, no se activa ninguna bandera.
Inexacto
El resultado exacto (es decir, sin redondear) no se puede representar con exactitud. Por defecto, devuelve el resultado correctamente redondeado.

Se trata de las mismas cinco excepciones que se definieron en la norma IEEE 754-1985, pero la excepción de división por cero se ha extendido a operaciones distintas de la división.

Algunas implementaciones de punto flotante decimal definen excepciones adicionales, [ 36 ] [ 37 ] que no forman parte de IEEE 754:

Sujetado
El exponente del resultado es demasiado grande para el formato de destino. Por defecto, se añadirán ceros al final del coeficiente para reducir el exponente al valor máximo utilizable. Si esto no es posible (ya que el número de dígitos necesarios superaría el del formato de destino), se producirá una excepción de desbordamiento.
Redondeado
El coeficiente de un resultado requiere más dígitos de los que permite el formato de destino. Se genera una excepción de inexactitud si se descarta algún dígito distinto de cero.

Valores especiales

cero con signo

En el estándar IEEE 754, el cero tiene signo, lo que significa que existe un "cero positivo" (+0) y un "cero negativo" (−0). En la mayoría de los entornos de ejecución , el cero positivo se suele imprimir como " 0" y el cero negativo como " -0". Los dos valores se comportan como iguales en comparaciones numéricas, pero algunas operaciones devuelven resultados diferentes para +0 y −0. Por ejemplo, 1/(−0) devuelve infinito negativo, mientras que 1/(+0) devuelve infinito positivo (de modo que se mantiene la identidad 1/(1/±∞) = ±∞ ). Otras funciones comunes con una discontinuidad en x = 0 que podrían tratar +0 y −0 de forma diferente incluyen Γ( x ) y la raíz cuadrada principal de y + xi para cualquier número negativo y . Como con cualquier esquema de aproximación, las operaciones que involucran "cero negativo" pueden causar confusión ocasionalmente. Por ejemplo, en IEEE 754, x = y no siempre implica 1/ x = 1/ y , ya que 0 = −0 pero 1/0 ≠ 1/(−0) . [ 38 ] Además, la raíz cuadrada recíproca [ h ] de ±0 es ±∞ mientras que la función matemática1/incógnita{\displaystyle 1/{\sqrt {x}}}Sobre los números reales no tiene ningún valor negativo.

números subnormales

Los valores subnormales rellenan el hueco de desbordamiento inferior con valores cuya distancia absoluta entre ellos es la misma que la de los valores adyacentes justo fuera de dicho hueco. Esto supone una mejora respecto a la práctica anterior de tener simplemente cero en el hueco de desbordamiento inferior, donde los resultados de desbordamiento inferior se sustituían por cero (vaciado a cero). [ 39 ]

El hardware moderno de punto flotante suele manejar valores subnormales (así como valores normales) y no requiere emulación por software para los valores subnormales.

Infinitos

Los infinitos de la recta numérica real extendida se pueden representar en tipos de datos de punto flotante IEEE, al igual que los valores de punto flotante comunes como 1, 1.5, etc. No son valores de error, aunque a menudo se utilizan (dependiendo del redondeo) como valores de reemplazo cuando hay un desbordamiento. Ante una excepción de división por cero, se devuelve un infinito positivo o negativo como resultado exacto. Un infinito también se puede introducir como un numeral (como la macro "INFINITY" de C, o " " si el lenguaje de programación permite esa sintaxis).

IEEE 754 requiere que los infinitos se manejen de una manera razonable, como por ejemplo:

  • (+∞) + (+7) = (+∞)
  • (+∞) × (−2) = (−∞)
  • (+∞) × 0 = NaN – no hay nada significativo que hacer

NaN

IEEE 754 especifica un valor especial llamado "No es un número" (NaN) que se devuelve como resultado de ciertas operaciones "inválidas", como 0/0, ∞×0 o sqrt(−1). En general, los NaN se propagan, es decir, la mayoría de las operaciones que involucran un NaN darán como resultado un NaN, aunque las funciones que devuelven un resultado definido para cualquier valor de punto flotante también lo harán para los NaN, por ejemplo, NaN ^ 0 = 1. Hay dos tipos de NaN: los NaN silenciosos predeterminados y, opcionalmente, los NaN de señalización . Un NaN de señalización en cualquier operación aritmética (incluidas las comparaciones numéricas) provocará que se señalice una excepción de "operación inválida".

La representación de NaN especificada por el estándar tiene algunos bits no especificados que podrían usarse para codificar el tipo o la fuente del error; pero no hay un estándar para esa codificación. En teoría, un sistema de tiempo de ejecución podría usar la señalización de NaN para marcar variables no inicializadas o extender los números de punto flotante con otros valores especiales sin ralentizar los cálculos con valores ordinarios, aunque tales extensiones no son comunes. Una variante de este enfoque (a veces llamada "NaN-boxing") es utilizada por algunos entornos de ejecución de JavaScript [ 40 ] y LuaJIT [ 41 ] para almacenar valores de puntero de 64 bits y valores de punto flotante de doble precisión IEEE 754 en el mismo tipo de datos, lo que permite a los entornos de ejecución eliminar la sobrecarga de asignaciones de memoria adicionales e indirecciones para valores de punto flotante.

Fundamentación del diseño

William Kahan , arquitecto principal del coprocesador de punto flotante Intel 80x87 y del estándar de punto flotante IEEE 754.

Es un error común pensar que las características más esotéricas del estándar IEEE 754 que se analizan aquí, como los formatos extendidos, NaN, infinitos, subnormales, etc., solo interesan a los analistas numéricos o a las aplicaciones numéricas avanzadas. De hecho, ocurre lo contrario: estas características están diseñadas para proporcionar valores predeterminados seguros y robustos a programadores con poca experiencia numérica, además de ser compatibles con bibliotecas numéricas sofisticadas desarrolladas por expertos. El principal diseñador del IEEE 754, William Kahan , señala que es incorrecto considerar que las características del estándar IEEE 754 para aritmética de punto flotante binario que no se aprecian solo pueden ser utilizadas por expertos en números. La realidad es muy distinta. En 1977, estas características se diseñaron en el Intel 8087 para abarcar el mercado más amplio posible. El análisis de errores nos indica cómo diseñar aritmética de punto flotante, como el estándar IEEE 754, con una tolerancia moderada a la ignorancia bienintencionada de los programadores. [ 42 ]

  • Los valores especiales como infinito y NaN aseguran que la aritmética de punto flotante sea algebraicamente completa: cada operación de punto flotante produce un resultado bien definido y no generará, por defecto, una interrupción o trampa de la máquina. Además, la elección de valores especiales devueltos en casos excepcionales se diseñó para dar la respuesta correcta en muchos casos. Por ejemplo, bajo la aritmética IEEE 754, una fracción continua comoR(z):=73z2+4z3{\displaystyle R(z):=7-{\cfrac {3}{z-2+{\cfrac {4}{z-3}}}}}puede implementarse de forma sencilla y dará la respuesta correcta incluso cuando haya una división por cero , porque cualquier número positivo dividido por cero resulta en +∞ , por ejemplo, cuando z = 3 , R ( z ) = 7. [ 43 ] Como señaló Kahan, la trampa no controlada consecutiva a un desbordamiento de conversión de punto flotante a entero de 16 bits que causó la pérdida de un cohete Ariane 5 no habría ocurrido bajo la política de punto flotante IEEE 754 predeterminada. [ 42 ]
  • Los números subnormales aseguran que para números de punto flotante finitos x e y , xy = 0 si y solo si x = y , como se esperaba, pero que no se cumplía bajo representaciones de punto flotante anteriores. [ 44 ]
  • Sobre la lógica de diseño del formato x87 de 80 bits , Kahan señala: "Este formato extendido está diseñado para usarse, con una pérdida de velocidad insignificante, para todas las operaciones aritméticas excepto las más simples con operandos de punto flotante y doble. Por ejemplo, debería usarse para variables temporales en bucles que implementan recurrencias como la evaluación de polinomios, productos escalares, fracciones parciales y continuas. A menudo evita el desbordamiento/subdesbordamiento prematuro o la cancelación local severa que puede arruinar algoritmos simples". [ 45 ] El cálculo de resultados intermedios en un formato extendido con alta precisión y exponente extendido tiene precedentes en la práctica histórica del cálculo científico y en el diseño de calculadoras científicas, por ejemplo, las calculadoras financieras de Hewlett-Packard realizaban funciones aritméticas y financieras con tres decimales más significativos de los que almacenaban o mostraban. [ 45 ] La implementación de precisión extendida permitió desarrollar fácilmente bibliotecas de funciones elementales estándar que normalmente daban resultados de doble precisión dentro de una unidad en el último lugar (ULP) a alta velocidad.
  • El redondeo correcto de los valores al valor representable más cercano evita sesgos sistemáticos en los cálculos y ralentiza la propagación de errores. Redondear los empates al número par elimina el sesgo estadístico que puede producirse al sumar cifras similares.
  • El redondeo dirigido se concibió como una ayuda para comprobar los límites de error, por ejemplo, en la aritmética de intervalos . También se utiliza en la implementación de algunas funciones.
  • La base matemática de las operaciones, en particular el redondeo correcto, permite demostrar propiedades matemáticas y diseñar algoritmos de punto flotante como 2Sum, Fast2Sum y el algoritmo de suma de Kahan , por ejemplo, para mejorar la precisión o implementar subrutinas aritméticas de precisión múltiple con relativa facilidad.

Una propiedad de los formatos de precisión simple y doble es que su codificación permite ordenarlos fácilmente sin usar hardware de punto flotante, como si los bits representaran enteros con signo y magnitud , aunque no está claro si esto fue una consideración de diseño (resulta notable que la representación de punto flotante hexadecimal anterior de IBM también tenía esta propiedad para números normalizados). Con la representación predominante de complemento a dos , interpretar los bits como enteros con signo ordena correctamente los positivos, pero invierte los negativos; como una posible corrección para esto, con una operación XOR para invertir el bit de signo para valores positivos y todos los bits para valores negativos, todos los valores se vuelven ordenables como enteros sin signo (con −0 < +0 ). [ 35 ]

Recomendaciones

Manejo alternativo de excepciones

La norma recomienda el manejo opcional de excepciones en diversas formas, incluyendo la sustitución previa de valores predeterminados definidos por el usuario, trampas (excepciones que modifican el flujo de control de alguna manera) y otros modelos de manejo de excepciones que interrumpen el flujo, como try/catch. Las trampas y otros mecanismos de excepción siguen siendo opcionales, como ocurría en la norma IEEE 754-1985.

La cláusula 9 del estándar recomienda operaciones matemáticas adicionales [ 46 ] que los estándares de lenguaje deberían definir. [ 47 ] Ninguna es necesaria para cumplir con el estándar.

Las siguientes son operaciones aritméticas recomendadas, que deben redondearse correctamente: [ 48 ]

ElasinPi{\displaystyle \operatorname {asinPi} },acosPi{\displaystyle \operatorname {acosPi} }ytanPi{\displaystyle \operatorname {tanPi} }Las funciones no formaban parte del estándar IEEE 754-2008 porque se consideraban menos necesarias. [ 50 ]asinPi{\displaystyle \operatorname {asinPi} }yacosPi{\displaystyle \operatorname {acosPi} }Se mencionaron, pero esto se consideró un error. [ 5 ] Los tres se añadieron en la revisión de 2019.

Las operaciones recomendadas también incluyen la configuración y el acceso a la dirección de redondeo en modo dinámico, [ 51 ] y operaciones de reducción de vectores definidas por la implementación, como suma, producto escalar y producto escalar (no se requiere un redondeo correcto). El estándar admite que los resultados numéricos de estas operaciones de reducción pueden diferir entre implementaciones debido al ancho del resultado intermedio y al orden de las operaciones. [ 52 ]

A partir de 2019También se recomiendan las operaciones aritméticas aumentadas [ 53 ] para los formatos binarios. Estas operaciones , especificadas para la suma, la resta y la multiplicación, producen un par de valores que consisten en un resultado correctamente redondeado al entero más cercano en el formato y el término de error, que se puede representar exactamente en el formato. En el momento de la publicación del estándar, no se conocen implementaciones de hardware, pero ya se habían implementado operaciones muy similares en software utilizando algoritmos bien conocidos. La historia y la motivación para su estandarización se explican en un documento de antecedentes. [ 54 ] [ 55 ]

Las operaciones minNum , maxNum , minNumMag y maxNumMag , anteriormente requeridas por IEEE 754-2008, se eliminaron en la revisión de 2019 debido a su falta de asociatividad . [ 56 ] En su lugar, se recomiendan dos conjuntos de nuevas operaciones de mínimo y máximo. [ 57 ] El primer conjunto contiene minimum , minimumNumber , maximum y maximumNumber . El segundo conjunto contiene minimumMagnitude , minimumMagnitudeNumber , maximumMagnitude y maximumMagnitudeNumber . La historia y la motivación de este cambio se explican en un documento de antecedentes. [ 58 ]

Evaluación de la expresión

El estándar recomienda cómo los estándares de lenguaje deben especificar la semántica de las secuencias de operaciones y señala las sutilezas de los significados literales y las optimizaciones que modifican el valor de un resultado. Por el contrario, la versión anterior de 1985 del estándar dejaba aspectos de la interfaz del lenguaje sin especificar, lo que provocaba un comportamiento inconsistente entre compiladores o diferentes niveles de optimización en un compilador optimizador .

Los lenguajes de programación deberían permitir al usuario especificar una precisión mínima para los cálculos intermedios de expresiones para cada base. Esto se denomina `preferredWidth` en el estándar, y debería ser posible configurarlo por bloque. Los cálculos intermedios dentro de las expresiones deberían realizarse, y los valores temporales deberían guardarse, utilizando el máximo entre el ancho de los operandos y el ancho preferido, si se ha definido. Por ejemplo, un compilador dirigido a hardware de punto flotante x87 debería tener un mecanismo para especificar que los cálculos intermedios deben usar el formato de doble extensión . El valor almacenado de una variable siempre debe usarse al evaluar expresiones posteriores, en lugar de cualquier valor anterior al redondeo y la asignación a la variable.

Reproducibilidad

La versión IEEE 754-1985 del estándar permitía muchas variaciones en las implementaciones (como la codificación de algunos valores y la detección de ciertas excepciones). La versión IEEE 754-2008 redujo estas tolerancias, pero aún persisten algunas variaciones (especialmente en formatos binarios). La cláusula de reproducibilidad recomienda que los estándares de lenguaje proporcionen un medio para escribir programas reproducibles (es decir, programas que produzcan el mismo resultado en todas las implementaciones de un lenguaje) y describe lo que se debe hacer para lograr resultados reproducibles.

Ejemplos concretos de comportamiento potencialmente no reproducible se pueden encontrar en C y C++ , que permiten el uso de mayor precisión para los resultados de operaciones de punto flotante y la contracción de expresiones de punto flotante, como la multiplicación y suma regulares en FMA y 1.0/sqrt(x)en una raíz cuadrada recíproca como una sola instrucción. [ 59 ] Los compiladores de C/C++ como GCC y cl.exe generalmente permiten ambos por defecto a menos que se les pida específicamente que no lo hagan, ya que estos cambios pueden generar código más rápido sin una pérdida obvia de precisión. Los compiladores también ofrecen optimizaciones "rápidas" más abiertamente no conformes. [ 60 ] [ 61 ] Las funciones matemáticas de C generalmente no se implementan para ser "redondeadas correctamente" y se suman al problema. [ 62 ] El entorno de punto flotante también puede ser cambiado inesperadamente por código de terceros.

Representación de personajes

El estándar requiere operaciones para convertir entre formatos admitidos y secuencias de caracteres externas . [ 63 ] Se requieren conversiones hacia y desde un formato de caracteres decimales para todos los formatos. La conversión a una secuencia de caracteres externa debe ser tal que la conversión de ida y vuelta, desde la representación binaria interna a texto decimal externo y de vuelta a la representación binaria interna, recuperará el número original cuando se utilice roundTiesToEven. [ 64 ] No hay ningún requisito para preservar la carga útil de un NaN silencioso o un NaN de señalización, y la conversión desde la secuencia de caracteres externa puede convertir un NaN de señalización en un NaN silencioso.

El valor binario original se conservará convirtiéndolo a decimal y luego de nuevo usando: [ 65 ]

  • 5 dígitos decimales para binario16,
  • 9 dígitos decimales para binary32,
  • 17 dígitos decimales para binary64,
  • 36 dígitos decimales para binary128.

Para otros formatos binarios, el número requerido de dígitos decimales es [ i ].

1+pagregistro10(2),{\displaystyle 1+\lceil p\log _{10}(2)\rceil ,}

donde p es el número de bits significativos en el formato binario, por ejemplo, 237 bits para binary256.

Gay [ 66 ] analiza algoritmos, con código, para la conversión redondeada correcta de binario a decimal y de decimal a binario, y Paxson y Kahan [ 67 ] para las pruebas . 

Con los formatos de punto flotante decimal, la conversión a secuencias de caracteres decimales es exacta y se garantiza el comportamiento de ida y vuelta siempre que la representación de texto conserve el cuanto [ 68 ] al mantener los ceros finales a la derecha del punto decimal en la mantisa. La representación decimal se conservará utilizando:

  • 7 dígitos decimales para decimal32,
  • 16 dígitos decimales para decimal64,
  • 34 dígitos decimales para decimal128.

literales hexadecimales

Para formatos binarios, el estándar recomienda proporcionar conversiones hacia y desde secuencias de caracteres hexadecimales con significantes externos , basadas en los literales de punto flotante hexadecimales de C99 . Dicho literal consta de un signo opcional ( +o -), el indicador "0x", un número hexadecimal con o sin punto, un indicador de exponente "p" y un exponente decimal con signo opcional. La sintaxis no distingue entre mayúsculas y minúsculas. [ 69 ] El exponente decimal se escala por potencias de 2. Por ejemplo, 0x0.1p0es 1/16 y 0x0.1p-4es 1/256. [ 70 ]

La norma no menciona los literales hexadecimales para los formatos decimales, ya que las secuencias de caracteres decimales pueden representar con precisión todos los valores de punto flotante decimal.

Véase también

  • formato de punto flotante bfloat16
  • Binade
  • Coprocesador
  • C99 para ejemplos de código que demuestran el acceso y el uso de las características de IEEE 754.
  • Aritmética de punto flotante , para conocer su historia, fundamentos de diseño y ejemplos de uso de las características de IEEE 754.
  • Aritmética de punto fijo , para un enfoque alternativo en el cálculo con números racionales (especialmente beneficioso cuando el rango del exponente es conocido, fijo o limitado en tiempo de compilación).
  • IBM System z9 , la primera CPU en implementar la aritmética decimal IEEE 754-2008 (utilizando microcódigo de hardware).
  • IBM z10 , IBM z196 , IBM zEC12 e IBM z13 son procesadores que implementan completamente la aritmética decimal IEEE 754-2008 en hardware.
  • ISO/IEC 10967 , aritmética independiente del idioma (LIA)
  • Minifloat , formatos binarios de punto flotante de baja precisión que siguen los principios IEEE 754.
  • Procesadores POWER6 , POWER7 y POWER8 que implementan completamente la aritmética decimal IEEE 754-2008 en hardware.
  • strictfp , una palabra clave obsoleta en el lenguaje de programación Java que anteriormente restringía la aritmética a precisión simple y doble IEEE 754 para garantizar la reproducibilidad en plataformas de hardware comunes (a partir de Java 17, este comportamiento es obligatorio).
  • El dilema del creador de tablas para obtener más información sobre el redondeo correcto de funciones.
  • Entorno numérico estándar de Apple
  • Punto flotante cónico
  • Posit , un formato de número alternativo

Notas

  1. Por ejemplo, si la base es 10, el signo es 1 (que indica negativo), la mantisa es 12345 y el exponente es −3, entonces el valor del número es (−1) 1 × 12345 × 10 −3 = −1 × 12345 × 0.001 = −12.345.
  2. Valores aproximados. Para obtener valores exactos, consulte la entrada de Wikipedia correspondiente a cada formato.
  3. Número de dígitos en la base utilizada, incluyendo cualquier dígito implícito, pero sin contar el bit de signo.
  4. Número correspondiente de dígitos decimales; consulte el texto para obtener más detalles.
  5. A diferencia del sistema decimal, no existe un formato de intercambio binario de 96 bits. Sin embargo, dicho formato sigue estando permitido como formato no de intercambio.
  6. El estándar recomienda 0 para NaN de señalización, 1 para NaN silenciosos, de modo que un NaN de señalización se puede silenciar cambiando solo este bit a 1, mientras que lo contrario podría producir la codificación de un infinito.
  7. No se activa ninguna bandera en ciertos casos de desbordamiento negativo.
  8. Véase Raíz cuadrada inversa rápida y Métodos para calcular raíces cuadradas#Métodos iterativos para raíces cuadradas recíprocas
  9. Como limitación de implementación, el redondeo correcto solo se garantiza para el número de dígitos decimales requeridos más 3 para el formato binario más grande admitido. Por ejemplo, si binary32 es el formato binario más grande admitido, entonces se garantiza que una conversión de una secuencia externa decimal con 12 dígitos decimales se redondeará correctamente al convertirla a binary32; pero no se garantiza la conversión de una secuencia de 13 dígitos decimales; sin embargo, el estándar recomienda que las implementaciones no impongan tal límite.

Referencias

  1. IEEE 754 2019
  2. Haasz, Jodi. "FW: ISO/IEC/IEEE 60559 (IEEE Std 754-2008)" . IEEE . Archivado del original el 27 de octubre de 2017. Consultado el 4 de abril de 2018 .
  3. "Acuerdo de cooperación entre organizaciones asociadas de desarrollo de estándares (PSDO) ISO/IEEE" (PDF) . ISO. 19 de diciembre de 2007. Consultado el 27 de diciembre de 2021 .
  4. ISO/IEC JTC 1/SC 25 2011 .
  5. 1 2 Cowlishaw, Mike (13 de noviembre de 2013). "Errata IEEE 754-2008" . speleotrove.com . Consultado el 24 de enero de 2020 .
  6. "ANSI/IEEE Std 754-2019" . ucbtest.org . Consultado el 16 de enero de 2024 .
  7. ISO/IEC JTC 1/SC 25 2020 .
  8. "Cuestiones para la próxima revisión de 754" . IEEE . Consultado el 12 de agosto de 2024 .
  9. IEEE 754 2019 , §2.1 .
  10. "SpiderMonkey Internals" . udn.realityripple.com . Consultado el 11 de marzo de 2018 .
  11. Klemens, Ben (septiembre de 2014). 21st Century C: C Tips from the New School . O'Reilly Media, Incorporated. pág. 160. ISBN  9781491904442. Consultado el 11 de marzo de 2018 .
  12. "zuiderkwast/nanbox: NaN-boxing en C" . GitHub . Consultado el 11 de marzo de 2018 .
  13. IEEE 754 2019 , §3.6 .
  14. IEEE 754 2019 , §3.7 .
  15. IEEE 754 2019 , §3.7 establece: "Los estándares de lenguaje deben definir mecanismos que admitan precisión extensible para cada base admitida."
  16. IEEE 754 2019 , §3.7 establece: "Los estándares o implementaciones de lenguaje deben admitir un formato de precisión extendida que extienda el formato básico más amplio que se admita en esa base."
  17. Familia Motorola MC68000 (PDF) . Manual de referencia del programador. NXP Semiconductors. 1992. págs. 1–16 , 1–18 , 1–23 . 
  18. IEEE 754 2019 , §4.3.1. "En los siguientes dos atributos de dirección de redondeo, un resultado infinitamente preciso con magnitud al menosbemax(b12b1pag){\displaystyle b^{\text{emax}}(b-{\tfrac {1}{2}}b^{1-p})}se redondeará a{\displaystyle \infty }Sin cambio de signo."
  19. IEEE 754 2019 , §4.3.3
  20. IEEE 754 2019 , §2.1
  21. 1 2 3 IEEE 754 2008 , §5.3.1
  22. 1 2 IEEE 754 2008 , §5.4.1
  23. IEEE 754 2008 , §5.4.2
  24. IEEE 754 2008 , §5.4.3
  25. IEEE 754 2008 , §5.3.2
  26. IEEE 754 2008 , §5.3.3
  27. IEEE 754 2008 , §5.5.1
  28. IEEE 754 2008 , §5.10
  29. IEEE 754 2008 , §5.11
  30. IEEE 754 2008 , §5.7.2
  31. IEEE 754 2008 , §5.7.4
  32. IEEE 754 2019 , §5.11
  33. 1 2 3 IEEE 754 2019 , §5.10
  34. "Implementar total_cmp para f32, f64 por golddranks · Solicitud de extracción n.° 72568 · rust-lang/rust" . GitHub . Contiene citas relevantes de IEEE 754-2008 y -2019. Incluye una implementación y explicación de un juego de palabras.
  35. 1 2 Herf, Michael (diciembre de 2001). "Trucos de radix" . stereopsis: graphics .
  36. "9.4. decimal — Aritmética de punto fijo y punto flotante decimal — Documentación de Python 3.6.5" . docs.python.org . Consultado el 4 de abril de 2018 .
  37. "Aritmética decimal - Condiciones excepcionales" . speleotrove.com . Consultado el 4 de abril de 2018 .
  38. Goldberg 1991 .
  39. ^ Müller, Jean-Michel; Brisebarre, Nicolás; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vicente; Melquiond, Guillaume; Revol, Nathalie ; Stehlé, Damián; Torres, Serge (2010). Manual de aritmética de coma flotante (1 ed.). Birkhäuser . doi : 10.1007/978-0-8176-4705-6 . ISBN  978-0-8176-4704-9.
  40. Wingo, Andy (18 de mayo de 2011). "Representación de valores en implementaciones de JavaScript" . wingolog . Archivado del original el 21 de agosto de 2025. Consultado el 9 de septiembre de 2025 .
  41. Pall, Mike (2 de noviembre de 2009). "Divulgación de propiedad intelectual y oportunidades de investigación de LuaJIT 2.0" . gmane.comp.lang.lua.general (Usenet) . Archivado del original (correo electrónico) el 7 de noviembre de 2009. Recuperado el 9 de septiembre de 2025. Aspectos de diseño de la VM: [...] Etiquetado NaN: se utilizan valores etiquetados de 64 bits para ranuras de pila y ranuras de tabla.
  42. 1 2 Kahan, William Morton ; Darcy, Joseph (2001) [1998-03-01]. "Cómo el punto flotante de Java perjudica a todos en todas partes" (PDF) . Archivado (PDF) del original el 16-08-2000 . Recuperado el 05-09-2003 .
  43. Kahan, William Morton (12 de febrero de 1981). "¿Por qué necesitamos un estándar de aritmética de punto flotante?" (PDF) . pág. 26. Archivado (PDF) del original el 4 de diciembre de 2004. 
  44. Severance, Charles (1998-02-20). "Una entrevista con el Viejo del Punto Flotante" .
  45. 1 2 Kahan, William Morton (11 de junio de 1996). "El efecto pernicioso de las pruebas de rendimiento informático en las matemáticas aplicadas, la física y la química" (PDF) . Archivado (PDF) del original el 13 de octubre de 2013.
  46. IEEE 754 2019 , §9.2
  47. IEEE 754 2019 , Cláusula 9
  48. IEEE 754 2019 , §9.2 .
  49. "Demasiada potencia: pow vs powr, powd, pown, rootn, compound" . IEEE . Consultado el 16 de enero de 2024. Dado que las tasas de crecimiento no pueden ser menores que -1, dichas tasas señalan excepciones no válidas.
  50. "Re: Faltan las funciones tanPi, asinPi y acosPi" . IEEE . Archivado del original el 6 de julio de 2017. Consultado el 4 de abril de 2018 .
  51. IEEE 754 2019 , §9.3 .
  52. IEEE 754 2019 , §9.4 .
  53. IEEE 754 2019 , §9.5
  54. Riedy, Jason; Demmel, James. "Propuesta de operaciones aritméticas aumentadas para IEEE-754 2018" (PDF) . 25.º Simposio IEEE sobre aritmética computacional (ARITH 2018). págs. 49–56 . Archivado (PDF) del original el 23 de julio de 2019. Recuperado el 23 de julio de 2019 . 
  55. "ANSI/IEEE Std 754-2019 – Documentos de antecedentes" . IEEE . Consultado el 16 de enero de 2024 .
  56. IEEE 754 2019 , §5.3.1 .
  57. IEEE 754 2019 , §9.6 .
  58. Chen, David. "La eliminación/degradación de las operaciones MinNum y MaxNum de IEEE 754-2018" (PDF) . IEEE . Consultado el 16 de enero de 2024 .
  59. Beeraka, Gautham (14 de diciembre de 2021). "El indicador /fp:contract y los cambios en los modos FP en VS2022" . devblogs.microsoft.com . Microsoft . Consultado el 9 de junio de 2025 .
  60. "Optimizar opciones (usando la colección de compiladores GNU (GCC))" . gcc.gnu.org .
  61. "/fp (Especificar el comportamiento de punto flotante)" . learn.microsoft.com .
  62. "¿Algún código que utilice intensivamente operaciones de punto flotante produce resultados bit a bit exactos en alguna arquitectura basada en x86?" . Stack Overflow .
  63. IEEE 754 2019 , §5.12
  64. IEEE 754 2019 , §5.12
  65. IEEE 754 2019 , §5.12.2 .
  66. Gay, David M. (1990-11-30), Conversiones binario-decimal y decimal-binario correctamente redondeadas , Manuscrito de Análisis Numérico, Murry Hill, NJ, EE. UU.: AT&T Laboratories, 90-10
  67. Paxson, Vern; Kahan, William (1991-05-22), Un programa para probar la conversión decimal-binaria IEEE , Manuscrito, CiteSeerX 10.1.1.144.5889 
  68. IEEE 754 2019 , §5.12.2
  69. IEEE 754 2019 , §5.12.3
  70. "6.9.3. Literales de punto flotante hexadecimales — Guía del usuario del compilador Glasgow Haskell 9.3.20220129" . ghc.gitlab.haskell.org . Consultado el 29 de enero de 2022 .

Estándares

  • Norma IEEE para aritmética binaria de punto flotante . ANSI/IEEE STD 754-1985. IEEE. 12 de octubre de 1985. págs. 1–20 . doi : 10.1109/IEEESTD.1985.82928 . ISBN  0-7381-1165-1.
  • IEEE Computer Society (29 de agosto de 2008). Norma IEEE para aritmética de punto flotante . IEEE STD 754-2008. IEEE. págs. 1–58 . doi : 10.1109/IEEESTD.2008.4610935 . ISBN  978-0-7381-5753-5Norma IEEE 754-2008.
  • IEEE Computer Society (22 de julio de 2019). Norma IEEE para aritmética de punto flotante . IEEE STD 754-2019. IEEE. págs. 1–82 . doi : 10.1109/IEEESTD.2019.8766229 . ISBN  978-1-5044-5924-2Norma IEEE 754-2019.
  • ISO/IEC JTC 1/SC 25 (junio de 2011). ISO/IEC/IEEE 60559:2011 — Tecnología de la información — Sistemas de microprocesadores — Aritmética de punto flotante . ISO. págs. 1–58 . {{cite book}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  • ISO/IEC JTC 1/SC 25 (mayo de 2020). ISO/IEC 60559:2020 — Tecnología de la información — Sistemas de microprocesadores — Aritmética de punto flotante . ISO. págs. 1–74 . {{cite book}}: CS1 maint: nombres numéricos: lista de autores ( enlace )

Referencias secundarias

  • Aritmética de punto flotante decimal , preguntas frecuentes, bibliografía y enlaces
  • Comparación de números de coma flotante binarios
  • Material de referencia IEEE 754
  • IEEE 854-1987  – Historia y actas
  • Lecturas complementarias para IEEE 754. Incluye perspectivas históricas.

Lecturas adicionales

  • Goldberg, David (marzo de 1991). "Lo que todo científico informático debería saber sobre la aritmética de punto flotante" . ACM Computing Surveys . 23 (1): 5– 48. doi : 10.1145/103162.103163 .(Con el anexo "Diferencias entre las implementaciones de IEEE 754":,)
  • Hecker, Chris (febrero de 1996). "Let's Get To The (Floating) Point" (PDF) . Game Developer : 19–24 .
  • Severance, Charles (marzo de 1998). "IEEE 754: Una entrevista con William Kahan" (PDF) . IEEE Computer . 31 (3): 114– 115. doi : 10.1109/MC.1998.660194 . Recuperado el 8 de marzo de 2019 .
  • Cowlishaw, Mike (junio de 2003). «Punto flotante decimal: Algoritmo para computadoras» (PDF) . 16.º Simposio IEEE sobre Aritmética Computacional, 2003. Actas . Los Alamitos, California: IEEE Computer Society. págs. 104-111 . doi : 10.1109/ARITH.2003.1207666 . ISBN  978-0-7695-1894-7. Consultado el 14 de noviembre de 2014 ..
  • Monniaux, David (mayo de 2008). "Los escollos de la verificación de cálculos de punto flotante" . ACM Transactions on Programming Languages ​​and Systems . 30 (3): 1– 41. arXiv : cs/0701192 . doi : 10.1145/1353445.1353446 .: Un compendio de comportamientos poco intuitivos de la aritmética de punto flotante en arquitecturas populares, con implicaciones para la verificación y las pruebas de programas.
  • Müller, Jean-Michel; Brunie, Nicolás; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vicente; Melquiond, Guillaume; Revol, Nathalie ; Torres, Serge (2018) [2010]. Manual de aritmética de coma flotante (2  ed.). Birkhäuser . doi : 10.1007/978-3-319-76526-6 . ISBN 978-3-319-76525-9.
  • Overton, Michael L. (2001). Escrito en el Instituto Courant de Ciencias Matemáticas , Universidad de Nueva York , Nueva York, EE. UU. Computación numérica con aritmética de punto flotante IEEE (1.ª  ed.). Filadelfia, EE. UU.: SIAM . doi : 10.1137/1.9780898718072 . ISBN 978-0-89871-482-1. 978-0-89871-571-2, 0-89871-571-7.2.ª edición, 2025. SIAM. ISBN 978-1-61197-840-7.
  • Cleve Moler sobre los números de punto flotante
  • Beebe, Nelson HF (22 de agosto de 2017). Manual de cálculo de funciones matemáticas: Programación con la biblioteca de software portátil MathCW (1.ª  ed.). Salt Lake City, UT, EE. UU.: Springer International Publishing AG . doi : 10.1007/978-3-319-64110-2 . ISBN 978-3-319-64109-6.
  • Hough, David G. (diciembre de 2019). "El estándar IEEE 754: uno para los libros de historia" . Computer . 52 (12). IEEE : 109–112 . doi : 10.1109/MC.2019.2926614 .
  • Norma ANSI/IEEE 754-2019
  • Kahan sobre la creación del estándar IEEE de punto flotante . Fragmentos del premio Turing . 16 de noviembre de 2020. Archivado del original el 8 de noviembre de 2021.