stringtranslate.com

IEEE 754-1985

IEEE 754-1985 [1] es un estándar histórico de la industria para representar números de punto flotante en computadoras , adoptado oficialmente en 1985 y reemplazado en 2008 por IEEE 754-2008 , y luego nuevamente en 2019 por una revisión menor IEEE 754-2019 . [2] Durante sus 23 años, fue el formato más utilizado para el cálculo de punto flotante. Se implementó en software, en forma de bibliotecas de punto flotante , y en hardware, en las instrucciones de muchas CPU y FPU . El primer circuito integrado que implementó el borrador de lo que se convertiría en IEEE 754-1985 fue el Intel 8087 .

IEEE 754-1985 representa números en binario y proporciona definiciones para cuatro niveles de precisión, de los cuales los dos más utilizados son:

El estándar también define representaciones para infinito positivo y negativo , un " cero negativo ", cinco excepciones para manejar resultados no válidos como la división por cero , valores especiales llamados NaN para representar esas excepciones, números denormales para representar números más pequeños que los mostrados arriba y cuatro redondeos . modos.

Representación de números

El número 0,15625 representado como un número de punto flotante IEEE 754-1985 de precisión simple. Ver texto para explicación.
Los tres campos en un flotante IEEE 754 de 64 bits

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

El número decimal 0,15625 10 representado en binario es 0,00101 2 (es decir, 1/8 + 1/32). (Los subíndices indican la base numérica ). De manera análoga a la notación científica , donde los números se escriben para tener un solo dígito distinto de cero a la izquierda del punto decimal, reescribimos este número para que tenga un solo 1 bit a la izquierda del " punto binario". Simplemente multiplicamos por la potencia apropiada de 2 para compensar el desplazamiento de los bits a la izquierda en tres posiciones:

Ahora podemos leer la fracción y el exponente: la fracción es 0,01 2 y el exponente es −3.

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

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

IEEE 754 agrega un sesgo al exponente para que, en muchos casos, los números puedan compararse convenientemente mediante el mismo hardware que compara enteros en complemento a 2 con signo . Usando un exponente sesgado, el menor de dos números positivos de punto flotante resultará "menor que" el mayor siguiendo el mismo orden que para los números enteros de signo y magnitud . Si dos números de punto flotante tienen signos diferentes, la comparación de signo y magnitud también funciona con exponentes sesgados. Sin embargo, si ambos números de punto flotante con exponentes sesgados son negativos, entonces se debe invertir el orden. Si el exponente se representara como, digamos, un número en complemento a 2, la comparación para ver cuál de dos números es mayor no sería tan conveniente.

El 1 inicial se omite ya que todos los números excepto el cero comienzan con un 1 inicial; el 1 inicial está implícito y en realidad no es necesario almacenarlo, lo que proporciona un poco más de precisión de forma "gratuita".

Cero

El número cero se representa especialmente:

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

Números desnormalizados

Las representaciones numéricas descritas anteriormente se denominan normalizadas, lo que significa que el dígito binario inicial implícito es un 1. Para reducir la pérdida de precisión cuando se produce un desbordamiento insuficiente , IEEE 754 incluye la capacidad de representar fracciones más pequeñas que las posibles en la representación normalizada, haciendo el dígito inicial implícito es 0. Estos números se denominan denormales . No incluyen tantos dígitos significativos como un número normalizado, pero permiten una pérdida gradual de precisión cuando el resultado de una operación no es exactamente cero pero está demasiado cerca de cero para ser representado por un número normalizado.

Un número anormal se representa con un exponente sesgado de todos los 0 bits, que representa un exponente de −126 en precisión simple (no −127) o −1022 en precisión doble (no −1023). [3] Por el contrario, el exponente sesgado más pequeño que representa un número normal es 1 (ver ejemplos a continuación).

Representación de no números

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

Infinito positivo y negativo

El infinito positivo y negativo se representan así:

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

Yaya

Algunas operaciones de aritmética de punto flotante no son válidas, como sacar la raíz cuadrada de un número negativo. El acto de alcanzar un resultado no válido se denomina excepción de punto flotante . Un resultado excepcional está representado por un código especial llamado NaN, que significa " No es un número ". Todos los NaN en IEEE 754-1985 tienen este formato:

signo = 0 o 1.
exponente sesgado = todos los 1 bits.
fracción = cualquier cosa excepto los 0 bits (ya que los 0 bits representan el infinito).

Alcance y precisión

Precisión relativa de números de precisión simple (binary32) y doble (binary64), en comparación con representaciones decimales que utilizan un número fijo de dígitos significativos . La precisión relativa se define aquí como ulp( x )/ x , donde ulp( x ) es la unidad que ocupa el último lugar en la representación de x , es decir, la brecha entre x y el siguiente número representable.

La precisión se define como la diferencia mínima entre dos representaciones de mantisa sucesivas; por tanto es una función sólo en la mantisa; mientras que la brecha se define como la diferencia entre dos números sucesivos. [4]

Precisión simple

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

Algunos ejemplos de valores de rango y espacio para exponentes dados con precisión simple:

Por ejemplo, 16.777.217 no se puede codificar como un valor flotante de 32 bits, ya que se redondeará a 16.777.216. Sin embargo, todos los números enteros dentro del rango representable que sean una potencia de 2 se pueden almacenar en un flotante de 32 bits sin redondear.

Precisión doble

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

Algunos ejemplos de valores de rango y espacio para exponentes dados con doble precisión:

Formatos extendidos

El estándar también recomienda el uso de formatos extendidos para realizar cálculos internos con una precisión mayor que la requerida para el resultado final, para minimizar los errores de redondeo: el estándar solo especifica requisitos mínimos de precisión y exponente para dichos formatos. El formato extendido x87 de 80 bits es el formato extendido más comúnmente implementado que cumple con estos requisitos.

Ejemplos

A continuación se muestran algunos ejemplos de representaciones IEEE 754 de precisión simple:

Comparar números de coma flotante

Cada combinación de bits posible es un NaN o un número con un valor único en el sistema de números reales extendido por afinidad con su orden asociado, excepto las dos combinaciones de bits para cero negativo y cero positivo, que a veces requieren atención especial (ver más abajo). . La representación binaria tiene la propiedad especial de que, excluyendo los NaN, dos números cualesquiera se pueden comparar como enteros de signo y magnitud ( se aplican problemas de endianidad ). Al comparar como enteros en complemento a 2 : si los bits de signo difieren, el número negativo precede al número positivo, por lo que el complemento a 2 da el resultado correcto (excepto que el cero negativo y el cero positivo deben considerarse iguales). Si ambos valores son positivos, la comparación en complemento a 2 vuelve a dar el resultado correcto. De lo contrario (dos números negativos), el orden correcto de FP es el opuesto al orden en complemento a 2.

Los errores de redondeo inherentes a los cálculos en coma flotante pueden limitar el uso de comparaciones para comprobar la igualdad exacta de los resultados. Elegir un rango aceptable es un tema complejo. Una técnica común es utilizar un valor épsilon de comparación para realizar comparaciones aproximadas. [6] Dependiendo de cuán indulgentes sean las comparaciones, los valores comunes incluyen 1e-6o 1e-5para precisión simple y 1e-14para precisión doble. [7] [8] Otra técnica común es ULP, que verifica cuál es la diferencia en los últimos dígitos, verificando efectivamente a cuántos pasos están los dos valores. [9]

Aunque el cero negativo y el cero positivo generalmente se consideran iguales a efectos de comparación, algunos operadores relacionales de lenguajes de programación y construcciones similares los tratan como distintos. Según la Especificación del lenguaje Java , [10] los operadores de comparación e igualdad los tratan como iguales, pero los distinguen (oficialmente comenzando con la versión 1.1 de Java pero en realidad con la 1.1.1), al igual que los métodos de comparación , e incluso de las clases y .Math.min()Math.max()equals()compareTo()compare()FloatDouble

Redondear números de coma flotante

El estándar IEEE tiene cuatro modos de redondeo diferentes; el primero es el predeterminado; los demás se denominan redondeos dirigidos .

Ampliando los números reales

El estándar IEEE emplea (y amplía) el sistema de números reales extendido por afinidad , con infinitos positivos y negativos separados. Durante la redacción, hubo una propuesta para que el estándar incorporara el sistema de números reales extendido proyectivamente , con un único infinito sin signo, proporcionando a los programadores una opción de selección de modo. Sin embargo, con el fin de reducir la complejidad del estándar final, se abandonó el modo proyectivo. Los coprocesadores de punto flotante Intel 8087 e Intel 80287 admiten este modo proyectivo. [11] [12] [13]

Funciones y predicados

Operaciones estándar

Se deben proporcionar las siguientes funciones:

Funciones y predicados recomendados

Historia

En 1976, Intel estaba iniciando el desarrollo de un coprocesador de punto flotante . [14] [15] Intel esperaba poder vender un chip que contuviera buenas implementaciones de todas las operaciones que se encuentran en las muy variadas bibliotecas de software matemático. [14] [16]

John Palmer, quien dirigió el proyecto, creía que el esfuerzo debería estar respaldado por un estándar que unifique las operaciones de punto flotante en procesadores dispares. Se puso en contacto con William Kahan de la Universidad de California , quien había ayudado a mejorar la precisión de las calculadoras de Hewlett-Packard . Kahan sugirió que Intel utilice el punto flotante del VAX de Digital Equipment Corporation (DEC). El primer VAX, el VAX-11/780, acababa de salir a finales de 1977 y su punto flotante gozaba de gran prestigio. Sin embargo, al intentar comercializar su chip en el mercado más amplio posible, Intel quería el mejor punto flotante posible y Kahan pasó a elaborar las especificaciones. [14] Kahan inicialmente recomendó que la base de coma flotante fuera decimal [17] [ ¿fuente no confiable? ] pero el diseño del hardware del coprocesador estaba demasiado avanzado para realizar ese cambio.

El trabajo dentro de Intel preocupó a otros proveedores, que iniciaron un esfuerzo de estandarización para garantizar la "igualdad de condiciones". Kahan asistió a la segunda reunión del grupo de trabajo sobre estándares IEEE 754, celebrada en noviembre de 1977. Posteriormente recibió permiso de Intel para presentar un borrador de propuesta basada en su trabajo para su coprocesador; se le permitió explicar detalles del formato y su fundamento, pero nada relacionado con la arquitectura de implementación de Intel. El borrador fue coescrito con Jerome Coonen y Harold Stone , y se conoció inicialmente como la "propuesta Kahan-Coonen-Stone" o "formato KCS". [14] [15] [16] [18]

Como un exponente de 8 bits no era lo suficientemente amplio para algunas operaciones deseadas para números de doble precisión, por ejemplo, para almacenar el producto de dos números de 32 bits, [19] tanto la propuesta de Kahan como una contrapropuesta de DEC utilizaron 11 bits. como el formato de punto flotante de 60 bits probado en el tiempo del CDC 6600 de 1965. [15] [18] [20] La propuesta de Kahan también preveía infinitos, que son útiles cuando se trata de condiciones de división por cero; valores que no son un número, que son útiles cuando se trata de operaciones no válidas; números anormales , que ayudan a mitigar los problemas causados ​​por el desbordamiento; [18] [21] [22] y un sesgo de exponente mejor equilibrado , que puede ayudar a evitar el desbordamiento y el desbordamiento al tomar el recíproco de un número. [23] [24]

Incluso antes de su aprobación, varios fabricantes habían implementado el proyecto de norma. [25] [26] El Intel 8087, que se anunció en 1980, fue el primer chip en implementar el borrador del estándar.

Coprocesador de punto flotante Intel 8087

En 1980, el chip Intel 8087 ya se lanzó, [27] pero DEC siguió oponiéndose, en particular a los números anormales, debido a preocupaciones de rendimiento y porque le daría a DEC una ventaja competitiva para estandarizar el formato de DEC.

Las discusiones sobre el desbordamiento gradual duraron hasta 1981, cuando un experto contratado por el DEC para evaluarlo se puso del lado de los disidentes. DEC hizo que se realizara el estudio para demostrar que el desbordamiento gradual era una mala idea, pero el estudio concluyó lo contrario y DEC cedió. En 1985, la norma fue ratificada, pero ya se había convertido en la norma de facto un año antes. implementado por muchos fabricantes. [15] [18] [5]

Ver también

Notas

  1. ^ Precisión: la precisión del número de dígitos decimales se calcula mediante number_of_mantissa_bits * Log 10 (2). Por lo tanto, ~7,2 y ~15,9 para precisión simple y doble respectivamente.

Referencias

  1. ^ Estándar IEEE para aritmética binaria de coma flotante . 1985. doi :10.1109/IEEESTD.1985.82928. ISBN 0-7381-1165-1.
  2. ^ "Norma ANSI/IEEE 754-2019". 754r.ucbtest.org . Consultado el 6 de agosto de 2019 .
  3. ^ Hennessy (2009). Organización y diseño de ordenadores . Morgan Kaufman. pag. 270.ISBN 9780123744937.
  4. ^ Hossam AH Fahmy; Shlomó Waser; Michael J. Flynn, Aritmética informática (PDF) , archivado desde el original (PDF) el 8 de octubre de 2010 , consultado el 2 de enero de 2011
  5. ^ abc William Kahan (1 de octubre de 1997). "Notas de la conferencia sobre el estado de IEEE 754" (PDF) . Universidad de California, Berkeley . Consultado el 12 de abril de 2007 .
  6. ^ "Godot math_funcs.h". GitHub.com . 30 de julio de 2022.
  7. ^ "Godot math_defs.h". GitHub.com . 30 de julio de 2022.
  8. ^ "Godot MathfEx.cs". GitHub.com .
  9. ^ "Comparación de números de coma flotante, edición de 2012". randomascii.wordpress.com . 26 de febrero de 2012.
  10. ^ "Especificaciones del lenguaje Java y de la máquina virtual". Documentación de Java .
  11. ^ John R. Hauser (marzo de 1996). "Manejo de excepciones de punto flotante en programas numéricos" (PDF) . Transacciones ACM sobre lenguajes y sistemas de programación . 18 (2): 139-174. doi : 10.1145/227699.227701 . S2CID  9820157.
  12. ^ David Stevenson (marzo de 1981). "IEEE Task P754: un estándar propuesto para aritmética binaria de punto flotante". Computadora IEEE . 14 (3): 51–62. doi :10.1109/CM.1981.220377. S2CID  15523399.
  13. ^ William Kahan y John Palmer (1979). "Sobre una propuesta de estándar de punto flotante". Boletín SIGNUM . 14 (Especial): 13–21. doi :10.1145/1057520.1057522. S2CID  16981715.
  14. ^ abcd "Intel y punto flotante: actualización de uno de los estándares más exitosos de la industria: la visión tecnológica para el estándar de punto flotante" (PDF) . Intel . 2016. Archivado desde el original (PDF) el 4 de marzo de 2016 . Consultado el 30 de mayo de 2016 .(11 páginas)
  15. ^ abcd "Una entrevista con el viejo del punto flotante". cs.berkeley.edu. 1998-02-20 . Consultado el 30 de mayo de 2016 .
  16. ^ ab Woehr, Jack, ed. (1 de noviembre de 1997). "Una conversación con William Kahan". Dr. Dobb . drdobbs.com . Consultado el 30 de mayo de 2016 .
  17. ^ W. Kahan 2003, persona. com. a Mike Cowlishaw y otros después de una reunión IEEE 754
  18. ^ abcd "IEEE 754: una entrevista con William Kahan" (PDF) . dr-chuck.com . Consultado el 2 de junio de 2016 .
  19. ^ "IEEE frente a formato binario de Microsoft; problemas de redondeo (completo)". Soporte de Microsoft . Microsoft . 2006-11-21. ID de artículo KB35826, Q35826. Archivado desde el original el 28 de agosto de 2020 . Consultado el 24 de febrero de 2010 .
  20. ^ Thornton, James E. (1970). Escrito en el Laboratorio de Diseño Avanzado, Control Data Corporation. Diseño de una computadora: The Control Data 6600 (PDF) (1 ed.). Glenview, Illinois, EE.UU.: Scott, Foresman and Company . LCCN  74-96462. Archivado (PDF) desde el original el 28 de agosto de 2020 . Consultado el 2 de junio de 2016 .(1+13+181+2+2 páginas)
  21. ^ Kahan, William Morton . "¿Por qué necesitamos un estándar aritmético de punto flotante?" (PDF) . cs.berkeley.edu . Consultado el 2 de junio de 2016 .
  22. ^ Kahan, William Morton ; Darcy, Joseph D. "Cómo el punto flotante de Java perjudica a todos en todas partes" (PDF) . cs.berkeley.edu . Consultado el 2 de junio de 2016 .
  23. ^ Turner, Peter R. (21 de diciembre de 2013). Análisis numérico y procesamiento paralelo: conferencias impartidas en The Lancaster…. Saltador. ISBN 978-3-66239812-8. Consultado el 30 de mayo de 2016 .
  24. ^ "Nombres para formatos de punto flotante estandarizados" (PDF) . cs.berkeley.edu . Consultado el 2 de junio de 2016 .
  25. ^ Charles Severance (20 de febrero de 1998). "Una entrevista con el viejo del punto flotante".
  26. ^ Charles Cesantía . "Historia del formato de punto flotante IEEE". Conexiones. Archivado desde el original el 20 de noviembre de 2009.
  27. ^ "Expresiones moleculares: ciencia, óptica y usted - Olympus MIC-D: Galería de circuitos integrados - Coprocesador matemático Intel 8087". micro.magnet.fsu.edu . Consultado el 30 de mayo de 2016 .

Otras lecturas

enlaces externos