stringtranslate.com

IEEE 754-1985

IEEE 754-1985 [1] es un estándar industrial histórico 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 la 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 en implementar el borrador de lo que se convertiría en IEEE 754-1985 fue el Intel 8087 .

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

El estándar también define representaciones para el 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 desnormalizados para representar números más pequeños que los que se muestran arriba y cuatro modos de redondeo .

Representación de números

El número 0,15625 se representa como un número de punto flotante IEEE 754-1985 de precisión simple. Consulte el texto para obtener una explicación.
Los tres campos en un flotante IEEE 754 de 64 bits

Los números de punto 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 del número ). De manera análoga a la notación científica , donde los números se escriben de manera que tengan un solo dígito distinto de cero a la izquierda del punto decimal, reescribimos este número de manera que tenga un solo bit 1 a la izquierda del "punto binario". Simplemente multiplicamos por la potencia de 2 adecuada 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 precisión doble , el sesgo es 1023 , por lo que el exponente sesgado en este ejemplo es 1020.
fracción = .01000… 2 .

IEEE 754 añade un sesgo al exponente de modo que los números se pueden comparar en muchos casos cómodamente con el mismo hardware que compara números enteros con signo en complemento a 2. Si se utiliza un exponente sesgado, el menor de dos números positivos en coma flotante resultará "menor que" el mayor siguiendo el mismo orden que para los números enteros con signo y magnitud . Si dos números en coma flotante tienen signos diferentes, la comparación de signo y magnitud también funciona con exponentes sesgados. Sin embargo, si ambos números en coma flotante con exponente sesgado son negativos, entonces el orden debe invertirse. Si el exponente se representara como, por ejemplo, un número en complemento a 2, la comparación para ver cuál de los dos números es mayor no sería tan conveniente.

Se omite el bit 1 inicial ya que todos los números excepto cero comienzan con un 1 inicial; el 1 inicial es implícito y en realidad no necesita almacenarse, lo que brinda un bit adicional de precisión "gratis".

Cero

El número cero se representa de forma especial:

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 , IEEE 754 incluye la capacidad de representar fracciones más pequeñas que las posibles en la representación normalizada, haciendo que el dígito inicial implícito sea un 0. Dichos números se denominan desnormalizados . 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, sino que está demasiado cerca de cero para ser representado por un número normalizado.

Un número desnormalizado se representa con un exponente sesgado de todos los bits 0, lo 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 rellena con todos 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 bits 1.
fracción = todos los bits 0.

Yaya

Algunas operaciones de aritmética de punto flotante no son válidas, como por ejemplo, sacar la raíz cuadrada de un número negativo. El acto de obtener un resultado no válido se denomina excepción de punto flotante. Un resultado excepcional se representa mediante 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 bits 1.
fracción = cualquier cosa excepto todos los bits 0 (ya que todos los bits 0 representan 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 en el último lugar en la representación de x , es decir, el espacio 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 lo tanto, es una función solo 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 brecha para exponentes dados en precisión simple:

Por ejemplo, 16.777.217 no se puede codificar como un número 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 número flotante de 32 bits sin redondeo.

Doble precisión

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

Algunos ejemplos de valores de rango y brecha para exponentes dados en doble precisión:

Formatos extendidos

La norma también recomienda que se utilicen formatos extendidos para realizar cálculos internos con una precisión mayor que la requerida para el resultado final, a fin de minimizar los errores de redondeo: la norma solo especifica los 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:

Comparación de números de punto 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 el cero negativo y el 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 pueden compararse como enteros de signo y magnitud ( se aplican problemas de endianness ). Al comparar como enteros de 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 del complemento a 2 da nuevamente el resultado correcto. De lo contrario (dos números negativos), el orden FP correcto es el opuesto al orden del complemento a 2.

Los errores de redondeo inherentes a los cálculos de punto flotante pueden limitar el uso de comparaciones para verificar la igualdad exacta de los resultados. Elegir un rango aceptable es un tema complejo. Una técnica común es usar un valor de comparación épsilon para realizar comparaciones aproximadas. [6] Dependiendo de qué tan 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 de lugar, verificando efectivamente cuántos pasos de distancia hay entre los dos valores. [9]

Aunque el cero negativo y el cero positivo se consideran generalmente 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 y los distinguen (oficialmente a partir de 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 clases y .Math.min()Math.max()equals()compareTo()compare()FloatDouble

Redondeo de números de punto 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 extiende) el sistema de números reales extendido de forma afín , 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 de forma proyectiva , 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 eliminó 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 empezando a desarrollar 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 unificara las operaciones de punto flotante en procesadores dispares. Se puso en contacto con William Kahan de la Universidad de California , que había ayudado a mejorar la precisión de las calculadoras de Hewlett-Packard . Kahan sugirió que Intel utilizara 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 era muy valorado. Sin embargo, buscando comercializar su chip en el mercado más amplio posible, Intel quería el mejor punto flotante posible, y Kahan pasó a redactar las especificaciones. [14] Kahan inicialmente recomendó que la base del punto flotante fuera decimal [17] [¿ fuente poco fiable? ] pero el diseño de hardware del coprocesador estaba demasiado avanzado para hacer ese cambio.

El trabajo dentro de Intel preocupó a otros proveedores, que establecieron un esfuerzo de estandarización para garantizar un "campo de juego nivelado". Kahan asistió a la segunda reunión del grupo de trabajo de estándares IEEE 754, celebrada en noviembre de 1977. Posteriormente recibió permiso de Intel para presentar un borrador de propuesta basado en su trabajo para su coprocesador; se le permitió explicar los 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 fue conocido 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 números, que son útiles cuando se trata de operaciones no válidas; números desnormalizados , que ayudan a mitigar los problemas causados ​​por el desbordamiento insuficiente; [18] [21] [22] y un sesgo de exponente mejor equilibrado , que puede ayudar a evitar el desbordamiento y el desbordamiento insuficiente al tomar el recíproco de un número. [23] [24]

Incluso antes de su aprobación, el proyecto de norma ya había sido implementado por varios fabricantes. [25] [26] El Intel 8087, que se anunció en 1980, fue el primer chip en implementar el proyecto de norma.

Coprocesador de punto flotante Intel 8087

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

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

Véase 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 punto flotante . 1985. doi :10.1109/IEEESTD.1985.82928. ISBN 0-7381-1165-1.
  2. ^ "ANSI/IEEE Std 754-2019". 754r.ucbtest.org . Consultado el 6 de agosto de 2019 .
  3. ^ Hennessy (2009). Organización y diseño de computadoras . Morgan Kaufmann. pág. 270. ISBN 9780123744937.
  4. ^ Hossam AH Fahmy; Shlomo 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). "Lecture Notes on the Status of 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. ^ "Math_defs.h de Godot". GitHub.com . 30 de julio de 2022.
  8. ^ "MathfEx.cs de Godot". GitHub.com .
  9. ^ "Comparación de números de punto flotante, edición 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) . ACM Transactions on Programming Languages ​​and Systems . 18 (2): 139–174. doi : 10.1145/227699.227701 . S2CID  9820157.
  12. ^ David Stevenson (marzo de 1981). "IEEE Task P754: A proposal standard for binary floating-point aritmetic" (Tarea P754 del IEEE: un estándar propuesto para la aritmética binaria de punto flotante). IEEE Computer . 14 (3): 51–62. doi :10.1109/CM.1981.220377. S2CID  15523399.
  13. ^ William Kahan y John Palmer (1979). "Sobre un estándar de punto flotante propuesto". Boletín SIGNUM . 14 (Especial): 13–21. doi :10.1145/1057520.1057522. S2CID  16981715.
  14. ^ abcd "Intel y el 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 anciano del punto flotante". cs.berkeley.edu. 1998-02-20 . Consultado el 2016-05-30 .
  16. ^ ab Woehr, Jack, ed. (1997-11-01). "Una conversación con William Kahan". Dr. Dobb's . drdobbs.com . Consultado el 30 de mayo de 2016 .
  17. ^ W. Kahan 2003, comunicación personal con 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 vs. Microsoft Binary Format; Rounding Issues (Complete)" (Formato binario IEEE vs. Microsoft; problemas de redondeo (completo)). Soporte técnico de Microsoft . Microsoft . 2006-11-21. ID de artículo KB35826, Q35826. Archivado desde el original el 2020-08-28 . Consultado el 2010-02-24 .
  20. ^ Thornton, James E. (1970). Escrito en Advanced Design Laboratory, Control Data Corporation. Diseño de una computadora: 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 dictadas en The Lancaster …. Springer. ISBN 978-3-66239812-8. Recuperado el 30 de mayo de 2016 .
  24. ^ "Nombres para formatos de coma 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 Severance . "Historia del formato de punto flotante IEEE". Connexions. Archivado desde el original el 20 de noviembre de 2009.
  27. ^ "Molecular Expressions: Science, Optics & You - Olympus MIC-D: Integrated Circuit Gallery - Intel 8087 Math Coprocessor". micro.magnet.fsu.edu . Consultado el 30 de mayo de 2016 .

Lectura adicional

Enlaces externos