IEEE 754

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
estándar IEEE para aritmética de punto flotante

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 en 1985 por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). El estándar abordó muchos problemas encontrados en las diversas implementaciones de punto flotante que dificultaban su uso de manera confiable y portátil. Muchas unidades de punto flotante de hardware 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 (incluyendo ceros firmados y números subnormales), infinitos, y valores especiales "no número" (NaNs)
  • formatos de intercambio: codificaciones (cuerdas bit) que pueden utilizarse para intercambiar datos de punto flotante en forma eficiente y compacta
  • Reglas de redondeo: propiedades para estar satisfecho al redondear números durante aritmética y conversiones
  • operaciones: aritmética y otras operaciones (como funciones trigonométricas) en formatos aritméticos
  • manejo de excepción: indicaciones de condiciones excepcionales (como división por cero, desbordamiento, etc.)

IEEE 754-2008, publicado en agosto de 2008, incluye casi todo el estándar IEEE 754-1985 original, más el estándar IEEE 854-1987 para aritmética de punto flotante independiente de Radix. La versión actual, IEEE 754-2019, se publicó en julio de 2019. Es una revisión menor de la versión anterior, que incorpora principalmente aclaraciones, correcciones de defectos y nuevas operaciones recomendadas.

Historia

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

En agosto de 2008 se publicó una nueva versión, IEEE 754-2008, tras un proceso de revisión de siete años, presidido por Dan Zuras y editado por Mike Cowlishaw. Reemplazó tanto el estándar IEEE 754-1985 (aritmética de punto flotante binario) como el estándar IEEE 854-1987 para aritmética de punto flotante independiente de Radix. Los formatos binarios del estándar original se incluyen en este nuevo estándar junto con tres nuevos formatos básicos, uno binario y dos decimales. Para cumplir con el estándar actual, una implementación debe implementar al menos uno de los formatos básicos como formato aritmético y formato de intercambio.

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

La versión actual, IEEE 754-2019 publicada en julio de 2019, se deriva y reemplaza a IEEE 754-2008, luego de un proceso de revisión iniciado en septiembre de 2015, presidido por David G. Hough y editado por Mike Cowlishaw. Incorpora principalmente aclaraciones (por ejemplo, totalOrder) y correcciones de defectos (por ejemplo, minNum), pero también incluye algunas operaciones nuevas recomendadas (por ejemplo, augmentedAddition).

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

La próxima revisión prevista de la norma es en 2028.

Formatos

Un formato IEEE 754 es un "conjunto de representaciones de valores numéricos y símbolos". Un formato también puede incluir cómo se codifica el conjunto.

Un formato de punto flotante se especifica mediante

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

Un formato comprende

  • Números finitos, que pueden ser descritos por tres enteros: s= a Signatura (cero o uno), c= a significando (o coeficienteNo tener más que p dígitos cuando se escribe en base b (es decir, un entero en el rango de 0 a 0 bp- 1), y q= an exponente tales que eminq+p− 1 ≤ emax. El valor numérico de un número tan finito es (1)−s × c × bq. Además, hay dos valores cero, llamados ceros firmados: el bit de signo especifica si un cero es +0 (positivo cero) o −0 (negativo cero).
  • Dos infinitos: +∞ y −∞.
  • Dos tipos de NaN (no-un-número): un NaN tranquilo (qNaN) y una señalización NaN (sNaN).

Por ejemplo, si b = 10, p = 7 y emax = 96, entonces emin = −95, el significado satisface 0 ≤ c9999999, y el exponente satisface − 101 ≤ q ≤ 90. En consecuencia, el número positivo distinto de cero más pequeño que se puede representar es 1×10−101, y el mayor es 9999999×1090 (9,999999×1096 ), por lo que el rango completo de números es desde −9,999999×1096 hasta 9,999999×1096. Los números −b1−emax y b1−emax (aquí, −1×10−95 y 1×10−95) son los números normales más pequeños (en magnitud); Los números distintos de cero entre estos números más pequeños se llaman números subnormales.

Representación y codificación en memoria

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

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 eligiendo el exponente representable más pequeño que permite representar el valor exactamente. Además, el exponente no se representa directamente, pero se agrega un sesgo para que el exponente representable más pequeño se represente como 1, y el 0 se utiliza para números subnormales. Para números con un exponente en el rango normal (el campo del exponente no es solo unos ni todos ceros), el bit inicial del significado siempre será 1. En consecuencia, un 1 inicial puede estar implícito en lugar de estar presente explícitamente en la codificación de la memoria. y según el estándar, la parte explícitamente representada del significado estará entre 0 y 1. Esta regla se llama convención de bits iniciales, convención de bits implícita o bit oculto. convención. Esta regla permite que el formato binario tenga un poco más de precisión. La convención de bits iniciales no se puede utilizar para los números subnormales ya que tienen un exponente fuera del rango del exponente normal y escalan según el exponente más pequeño representado como se usa para los números normales más pequeños.

Debido a la posibilidad de múltiples codificaciones (al menos en formatos llamados formatos de intercambio), un NaN puede transportar 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 el origen del NaN (pero la carga útil puede tener otros usos, como NaN-boxing).

Formatos básicos y de intercambio

El estándar define cinco formatos básicos que reciben su nombre por su base numérica y el número de bits utilizados en su codificación de intercambio. Hay 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 binario32 y binario64 son los formatos simple y doble de IEEE 754-1985 respectivamente. Una implementación conforme debe implementar completamente al menos uno de los formatos básicos.

El estándar también define formatos de intercambio, que generalizan estos formatos básicos. Para los formatos binarios, se requiere la convención de bits iniciales. La siguiente tabla resume los formatos de intercambio más pequeños (incluidos los básicos).

NombreNombre comúnBasebits o dígitos significativosdígitos decimalesBodas exponentesDecimal E maxSesgo exponenteE minE maxNotas
binario16Media precisión2113.3154.5124−1 = 15−14+15Intercambio
binario32Precisión sencilla2247.22838.2327−1 = 127−126+127binario básico
binario64Doble precisión25315.9511307.95210−1 = 1023−10-22+1023binario básico
binario128Precisión cuádruple211334.02154931.77214−1 = 16383−16382+16383binario básico
binario256Precisión Octuple223771.341978913.2218−1 = 262143−26−2142+262143Intercambio
decimal3210777.5896101,95 - 95+96Intercambio
decimal641016169.58384398.38−3+384Basic decimal
decimal12810343413.586144617661−43+6144Basic decimal

Tenga en cuenta que en la tabla anterior, 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 (con cierta pérdida de precisión). Por ejemplo, el número positivo más pequeño que se puede representar en binario64 es 2−1074; Las contribuciones a la cifra −1074 incluyen el valor E min −1022 y todos menos uno de los 53 bits significativos (2−1022 − (53 − 1) = 2−1074).

Los dígitos decimales son dígitos × log10 base. Esto da una precisión aproximada en número de dígitos decimales.

E máx decimal es Emax × log10 base. Esto da un valor aproximado del exponente decimal máximo.

Los formatos binario32 (simple) y binario64 (doble) son dos de los formatos más comunes que se utilizan en la actualidad. La siguiente figura muestra la precisión absoluta para ambos formatos en un rango de valores. Esta cifra se puede utilizar para seleccionar un formato apropiado dado el valor esperado de un número y la precisión requerida.

Precisión de binario32 y binario64 en el rango 10−12 a 1012

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

y el diseño de 64 bits es similar.

Formatos de precisión extendidos y extensibles

El estándar especifica formatos de precisión extendidos y extensibles opcionales, que proporcionan mayor precisión que los formatos básicos. Un formato de precisión extendida amplía un formato básico utilizando más precisión y más rango de exponentes. Un formato de precisión extensible permite al usuario especificar la precisión y el rango de exponentes. Una implementación puede utilizar cualquier representación interna que elija para dichos formatos; todo lo que hay que definir son sus parámetros (b, p y emax). Estos parámetros describen de forma única el conjunto de números finitos (combinaciones de signo, significado 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 compatible b. El estándar recomienda que los estándares e implementaciones del lenguaje admitan un formato extendido que tenga una mayor precisión que el formato básico más grande admitido para cada base b. Para un formato extendido con una precisión entre dos formatos básicos, el rango de exponentes debe ser tan grande como el del siguiente formato básico más amplio. Entonces, por ejemplo, un número binario de precisión extendida de 64 bits debe tener un valor 'emax' de al menos 16383. El formato extendido x87 de 80 bits cumple con este requisito.

Formatos de intercambio

Los formatos de intercambio están destinados al intercambio de datos de punto flotante utilizando 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 longitud 16 bits, 32 bits, 64 bits y cualquier múltiplo de 32 bits ≥ 128. El formato de 16 bits está destinado al 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 compensado por un sesgo y p - 1 bits que describen el significado. El ancho del campo exponente para un formato de k bits se calcula como w = round(4 log2(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 exponentes (5 y 8 respectivamente) de los que proporcionaría esta fórmula (3 y 7 respectivamente)..

Al igual que con IEEE 754-1985, el campo de exponente sesgado se completa con los bits 1 para indicar infinito (campo de significado final = 0) o NaN (campo de significado 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 significativo final, 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 de cualquier múltiplo de 32 bits. Al igual que con el intercambio binario, el esquema de codificación para los formatos de intercambio decimal codifica el signo, el exponente y el significado. Se definen dos codificaciones diferentes a nivel de bits y el intercambio se complica por el hecho de que puede ser necesario algún indicador externo de la codificación en uso.

Las dos opciones permiten codificar el significado como una secuencia comprimida de dígitos decimales utilizando decimales densamente empaquetados o, alternativamente, como un entero binario. El primero es más conveniente para la implementación directa del estándar en hardware, mientras que el segundo es más adecuado para la emulación de software en una computadora binaria. En cualquier caso, el conjunto de números (combinaciones de signo, significado y exponente) que pueden codificarse 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; los demás se denominan redondeos dirigidos:

Showing translation for

Rounding to nearest

  • Ronda a más cercana, lazos hasta– rondas al valor más cercano; si el número cae a mitad de camino, se redondea al valor más cercano con un dígito aún menos significativo.
  • Redondeado a más cercano, lazos lejos de cero (o lazos) – rondas al valor más cercano; si el número cae a mitad de camino, se redondea al valor más cercano (para números positivos) o abajo (para números negativos).

En los extremos, un valor con una magnitud estrictamente inferior a k=bemax()b− − 12b1− − p){displaystyle k=b^{text{emax}(b-{tfrac {1} {2}b^{1-p}} será redondeado al número mínimo o máximo finito (dependiendo del signo del valor). Cualquier número con exactamente esta magnitud se consideran vínculos; esta elección de corbata puede ser conceptualizada como el punto medio entre ± ± bemax()b− − b1− − p){displaystyle pm b^{text{emax}(b-b^{1-p}} y ± ± bemax+1{displaystyle pm b^{text{emax}+1}}, que eran el exponente no limitado, serían los próximos números representables de punto flotante de mayor magnitud. Números con una magnitud estrictamente mayor que k{displaystyle k} son redondeados al infinito correspondiente.

"Redondear al más cercano, empates a pares" es el valor predeterminado para punto flotante binario y el valor predeterminado recomendado para decimal. "Redondear al más cercano, empates al visitante" solo es necesario para implementaciones decimales.

Redondeos dirigidos

  • Ronda hacia 0– redondeo dirigido hacia cero (también conocido como truncación).
  • Redondo hacia +∞– redondeo dirigido hacia el infinito positivo (también conocido como redondeando o techo).
  • Redondo hacia −– redondeo dirigido hacia el infinito negativo (también conocido como redondeando o planta baja).
Ejemplo de redondeo a enteros utilizando las reglas IEEE 754
ModoValor de ejemplo
+11.5 +12.5 −11,5 −12,5
a más cercana, lazos a +12.0 +12.0 −12.0 −12.0
a más cercana, lazos lejos de cero +12.0 +13.0 −12.0 −13.0
hacia 0 +11.0 +12.0 −11.0 −12.0
hacia + +12.0 +13.0 −11.0 −12.0
hacia − +11.0 +12.0 −12.0 −13.0

A menos que se especifique lo contrario, el resultado en coma flotante de una operación se determina aplicando la función de redondeo al resultado (matemático) infinitamente preciso. Se dice que esta operación está correctamente redondeada. Este requisito se denomina redondeo correcto.

Operaciones requeridas

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

  • Conversiones a y desde entero
  • Valores anteriores y siguientes consecutivos
  • Operaciones aritméticas (add, subtract, multiplique, divida, raíz cuadrada, multiplicada-add, restante, mínimo, máximo)
  • Conversiones (entre formatos, a y desde cadenas, etc.)
  • Escalada y cuantificación (para decimales)
  • Copiar y manipular el signo (abs, negate, etc.)
  • Comparaciones y pedidos totales
  • Clasificación de números (subnormal, finito, etc.) y pruebas para NaNs
  • Probando y estableciendo banderas de estado

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. Cualquier comparación con un NaN se considera desordenada. −0 y +0 se comparan como iguales.

Predicado de orden total

El estándar proporciona un predicado totalOrder, que define un orden total en los miembros canónicos del formato aritmético admitido. El predicado concuerda con los predicados de comparación cuando un número de punto flotante es menor que el otro. El predicado totalOrder no impone un orden total en 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. IEEE 754-2019 incorpora aclaraciones de 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 en un entero de signo-magnitud (asumiendo un orden de carga útil). consistente con esta comparación), un viejo truco para comparar FP sin una FPU.

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. No se requiere ningún otro manejo de excepciones, pero se recomiendan alternativas adicionales no predeterminadas (consulte § Manejo de excepciones alternativo).

Las cinco posibles excepciones son

  • Operación inválida: matemáticamente indefinida, Por ejemplo., la raíz cuadrada de un número negativo. Por defecto, devuelve qNan.
  • División por cero: una operación sobre operados finitos da un resultado infinito exacto, Por ejemplo., 1/0 o log(0). Por defecto, devuelve ±finidad.
  • Overflow: a finite result is too large to be represented accurately (i.e., su exponente con un rango de exponentes sin límites sería más grande que emax). Por defecto, devuelve ±infinidad para los modos de redondeo a reposo (y sigue las reglas de redondeo para los modos de redondeo dirigidos).
  • Desbordamiento: un resultado es muy pequeño (fuera del rango normal). Por defecto, devuelve un número menor o igual al número normal mínimo positivo en magnitud (siguiendo las reglas de redondeo); un número subnormal siempre implica una excepción de subida, pero por defecto, si es exacto, no se levanta la bandera.
  • Inexacto: el exacto (i.e.El resultado no es representable exactamente. Por defecto, devuelve el resultado redondeado correctamente.

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

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

  • Clamped: el exponente de un resultado es demasiado grande para el formato de destino. Por defecto, se añadirán ceros de seguimiento al coeficiente para reducir el exponente al mayor valor utilizable. Si esto no es posible (porque esto causaría que el número de dígitos necesita ser más que el formato de destino) entonces se produce una excepción de desbordamiento.
  • Redondeado: el coeficiente de resultado requiere más dígitos que el formato de destino proporciona. Se indica una excepción inexacta si se descartan los dígitos no cero.

Además, operaciones como la cuantización cuando cualquiera de los operandos es infinito o cuando el resultado no se ajusta al formato de destino, también indicarán una excepción de operación no válida.

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 suele imprimirse como "0" y el cero negativo como "-0". Los dos valores se comportan igual en comparaciones numéricas, pero algunas operaciones arrojan resultados diferentes para +0 y −0. Por ejemplo, 1/(−0) devuelve infinito negativo, mientras que 1/+0 devuelve infinito positivo (de modo que la identidad 1/(1/±∞) = ±∞ es mantenido). Otras funciones comunes con una discontinuidad en x=0 que podrían tratar +0 y −0 de manera diferente incluyen log(x), signum(x) y la raíz cuadrada principal de y + xi para cualquier número negativo y. Como ocurre con cualquier esquema de aproximación, las operaciones que involucran "cero negativo" ocasionalmente puede causar confusión. Por ejemplo, en IEEE 754, x = y no siempre implica 1/ x = 1/y, como 0 = −0 pero 1/0 ≠ 1/−0.

Números subnormales

Los valores subnormales llenan el espacio de subdesbordamiento con valores donde la distancia absoluta entre ellos es la misma que para los valores adyacentes justo fuera del espacio de subdesbordamiento. Esta es una mejora con respecto a la práctica anterior de tener solo cero en la brecha de subflujo, y donde los resultados de subflujo se reemplazaban por cero (flujo a cero).

El hardware moderno de punto flotante generalmente maneja valores subnormales (así como valores normales) y no requiere emulación de software para 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 ordinarios como 1, 1,5, etc. No son valores de error de ninguna manera, aunque a menudo lo son (depende en el redondeo) utilizados como valores de reemplazo cuando hay un desbordamiento. Tras 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 número (como la macro "INFINITY" de C, o "" si el el lenguaje de programación permite esa sintaxis).

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

  • (+∞) + (+7) = (+∞)
  • (+vicios) × (2) = (—
  • (+∞) × 0 = NaN – no hay algo significativo que hacer

NaN

IEEE 754 especifica un valor especial llamado "No es un número" (NaN) que se devolverá como resultado de ciertos errores "no válidos" operaciones, como 0/0, ∞×0 o sqrt(−1). En general, los NaN se propagarán, es decir, la mayoría de las operaciones que involucran un NaN darán como resultado un NaN, aunque las funciones que darían algún resultado definido para cualquier valor de punto flotante dado también lo harán para los NaN, p. NaN ^ 0 = 1. Hay dos tipos de NaN: los NaN silenciosos predeterminados y, opcionalmente, los NaN de señalización. Una señalización NaN en cualquier operación aritmética (incluidas las comparaciones numéricas) provocará una "operación no válida" excepción a señalar.

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 existe un estándar para esa codificación. En teoría, un sistema de tiempo de ejecución podría utilizar los NaN de señalización para marcar variables no inicializadas o ampliar los números de punto flotante con otros valores especiales sin ralentizar los cálculos con valores ordinarios, aunque dichas extensiones no son comunes.

Fundamentos del diseño

William Kahan. Un arquitecto primario del coprocesador de punto flotante Intel 80x87 y el estándar IEEE 754.

Es un error común pensar que las características más esotéricas del estándar IEEE 754 discutidas aquí, como formatos extendidos, NaN, infinitos, subnormales, etc., solo son de interés para analistas numéricos o para aplicaciones numéricas avanzadas. De hecho, ocurre lo contrario: estas características están diseñadas para brindar valores predeterminados sólidos y seguros para programadores numéricamente no sofisticados, además de admitir bibliotecas numéricas sofisticadas creadas por expertos. El diseñador clave de IEEE 754, William Kahan, señala que es incorrecto "... [considerar] características del estándar IEEE 754 para aritmética binaria de punto flotante que... [no] se consideran características utilizables por nadie más que expertos numéricos. Los hechos son todo lo contrario. En 1977, esas características se diseñaron en el Intel 8087 para servir al mercado más amplio posible... El análisis de errores nos dice cómo diseñar aritmética de punto flotante, como el estándar IEEE 754, moderadamente tolerante a la ignorancia bien intencionada entre los programadores.

  • Los valores especiales como la infinidad y la NaN aseguran que la aritmética de punto flotante esté completa algebraicamente: cada operación de punto flotante produce un resultado bien definido y no —por defecto— ha interrumpido una máquina o trampa. Además, las opciones de los valores especiales devueltos en casos excepcionales fueron diseñadas para dar la respuesta correcta en muchos casos. Por ejemplo, bajo IEEE 754 aritmética, fracciones continuas como R(z):= 7 − 3/[z − 2 − 1/(z − 7 + 10/[z − 2 − 2/(z − 3)]) dará la respuesta correcta sobre todas las entradas, ya que la brecha potencial por cero, por ejemplo, para z = 3, se maneja correctamente dando +infinito, y así tales excepciones pueden ser ignoradas con seguridad. Como señaló Kahan, la trampa desmontada consecutiva a un punto flotante a un flujo de conversión de enteros de 16 bits que causó la pérdida de un cohete Ariane 5 no habría ocurrido bajo la política de posición flotante IEEE 754 por defecto.
  • Los números subnormales aseguran que finito números de punto flotante x y y, x − y = 0 si y sólo si x = y, como se esperaba, pero que no se mantuvo bajo anteriores representaciones de punto flotante.
  • Sobre la racionalidad del diseño del formato x87 80-bit, Kahan señala: "Este formato extendido está diseñado para ser utilizado, con pérdida insignificante de velocidad, para todos menos el aritmético más simple con flotador y doble operandos. Por ejemplo, se debe utilizar para las variables de arañazo en bucles que implementan recurrences como la evaluación polinomio, productos escalar, fracciones parciales y continuas. A menudo evita el exceso prematuro / flujo de carga o cancelación local severa que puede estropear algoritmos simples". La computación 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 realizaron funciones aritméticas y financieras a tres decimales más significativos que almacenados o mostrados. La implementación de las bibliotecas estándar de funciones primarias de precisión ampliada permitió desarrollarse fácilmente que normalmente dieron resultados de doble precisión dentro de una unidad en el último lugar (ULP) a alta velocidad.
  • El redondeo correcto de valores al valor representable más cercano evita sesgos sistemáticos en cálculos y retrasa el crecimiento de errores. Lazos de redondeo para incluso eliminar el sesgo estadístico que puede ocurrir en la adición de cifras similares.
  • El redondeo directo fue concebido como una ayuda con la comprobación de límites de errores, por ejemplo en intervalo aritmético. También se utiliza en la ejecución de algunas funciones.
  • La base matemática de las operaciones, en particular el redondeo correcto, permite probar propiedades matemáticas y diseñar algoritmos de punto flotante como 2Sum, Fast2Sum y Kahan summation algoritmo, por ejemplo para mejorar la precisión o implementar subroutinas aritméticas de múltiples precisión relativamente fácilmente.

Una propiedad de los formatos de precisión simple y doble es que su codificación permite ordenarlos fácilmente sin utilizar hardware de punto flotante. Sus bits interpretados como un entero en complemento a dos ya clasifican los positivos correctamente, con los negativos invertidos. Con un xor para invertir el bit de signo para valores positivos y todos los bits para valores negativos, todos los valores se pueden ordenar como enteros sin signo (con −0 < +0). No está claro si se pretende esta propiedad.

Recomendaciones

Manejo alternativo de excepciones

El estándar recomienda un manejo de excepciones opcional en varias formas, incluida la sustitución previa de valores predeterminados definidos por el usuario y trampas (excepciones que cambian el flujo de control de alguna manera) y otros modelos de manejo de excepciones que interrumpen el flujo, como try/ atrapar. Las trampas y otros mecanismos de excepción siguen siendo opcionales, como lo eran en IEEE 754-1985.

Operaciones recomendadas

La cláusula 9 del estándar recomienda operaciones matemáticas adicionales que los estándares del lenguaje deberían definir. No se requiere ninguno para cumplir con el estándar.

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

Las funciones asinPi, acosPi y tanPi no formaban parte de el estándar IEEE 754-2008 porque se consideraron menos necesarios. Se mencionaron asinPi, acosPi, pero esto se consideró un error. Los tres se agregaron en la revisión de 2019.

Las operaciones recomendadas también incluyen configurar y acceder a la dirección de redondeo del modo dinámico y operaciones de reducción de vectores definidas por la implementación, como suma, producto escalado y producto escalar, cuya precisión no está especificada por el estándar.

A partir de 2019, también se recomiendan operaciones aritméticas aumentadas para los formatos binarios. Estas operaciones, especificadas para suma, resta y multiplicación, producen un par de valores que consisten en un resultado correctamente redondeado al 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 implementaron 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.

A partir de 2019, los minNum, maxNum, minNumMag y maxNumMag requeridos anteriormente en IEEE 754-2008 ahora son en desuso debido a su no asociatividad. En cambio, se recomiendan dos conjuntos de nuevas operaciones mínimas y máximas. El primer conjunto contiene mínimo, númeromínimo, máximo y númeromáximo. 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.

Evaluación de expresiones

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

Los lenguajes de programación deberían permitir al usuario especificar una precisión mínima para cálculos intermedios de expresiones para cada base. Esto se conoce como preferredWidth en el estándar y debería ser posible configurarlo por bloque. Se deben calcular los cálculos intermedios dentro de las expresiones y guardar los temporales, utilizando el ancho máximo de los operandos y el ancho preferido, si está establecido. Así, por ejemplo, un compilador destinado a hardware de punto flotante x87 debería tener un medio para especificar que los cálculos intermedios deben utilizar el formato doblemente extendido. El valor almacenado de una variable siempre debe usarse al evaluar expresiones posteriores, en lugar de cualquier precursor anterior a redondear y asignar 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). IEEE 754-2008 ha reducido estas asignaciones, pero aún quedan algunas variaciones (especialmente para formatos binarios). La cláusula de reproducibilidad recomienda que los estándares del lenguaje proporcionen un medio para escribir programas reproducibles (es decir, programas que producirán el mismo resultado en todas las implementaciones de un lenguaje) y describe lo que se debe hacer para lograr resultados reproducibles.

Representación del personaje

El estándar requiere operaciones para convertir entre formatos básicos y formatos de secuencia de caracteres externos. Se requieren conversiones hacia y desde un formato de carácter decimal para todos los formatos. La conversión a una secuencia de caracteres externa debe ser tal que la conversión de nuevo mediante redondeo al más cercano y los vínculos pares recuperen el número original. No es necesario preservar la carga útil de un NaN silencioso o de un NaN de señalización, y la conversión de 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 viceversa usando:

  • 5 dígitos decimales para binario16,
  • 9 dígitos decimales para binario32,
  • 17 dígitos decimales para binario64,
  • 36 dígitos decimales para binario128.

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

1+⌈ ⌈ plog10⁡ ⁡ ()2)⌉ ⌉ ,{displaystyle 1+lceil plog _{10}(2)rceil}
Did you mean:

where p is the number of significant bits in the binary format, e.g. 237 bits for binary 256.

Cuando se utiliza un formato de punto flotante decimal, la representación decimal se conservará mediante:

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

Gay analiza los algoritmos, con código, para la conversión redondeada correctamente de binario a decimal y de decimal a binario, y Paxson y Kahan, para realizar pruebas.

Literales hexadecimales

El estándar recomienda proporcionar conversiones hacia y desde secuencias externas de caracteres con significado hexadecimal, basadas en los literales de punto flotante hexadecimal de C99. Dicho literal consta de un signo opcional (+ o -), el indicador "0x", un número hexadecimal con o sin punto, un exponente indicador "p" y un exponente decimal con signo opcional. La sintaxis no distingue entre mayúsculas y minúsculas. El exponente decimal se escala en potencias de 2, por lo que, por ejemplo, 0x0.1p-4 es 1/256.

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save