stringtranslate.com

Formato de punto flotante de precisión cuádruple

En informática , la precisión cuádruple (o precisión cuádruple ) es un formato de número de computadora basado en punto flotante binario que ocupa 16 bytes (128 bits) con una precisión al menos el doble de la precisión doble de 53 bits .

Esta precisión cuádruple de 128 bits está diseñada no sólo para aplicaciones que requieren resultados con una precisión superior al doble [1], sino también, como función principal, para permitir el cálculo de resultados de precisión doble de forma más fiable y precisa al minimizar los errores de desbordamiento y redondeo en los cálculos intermedios y las variables de referencia. William Kahan , arquitecto principal del estándar de punto flotante IEEE 754 original, señaló: "Por ahora, el formato extendido de 10 bytes es un compromiso tolerable entre el valor de la aritmética extraprecisa y el precio de implementarlo para que se ejecute rápido; muy pronto dos bytes más de precisión serán tolerables y, en última instancia, un formato de 16 bytes... Ese tipo de evolución gradual hacia una precisión más amplia ya estaba en perspectiva cuando se diseñó el estándar IEEE 754 para aritmética de punto flotante ". [2]

En IEEE 754-2008, el formato base 2 de 128 bits se denomina oficialmente binary128 .

Formato binario de punto flotante de precisión cuádruple IEEE 754: binary128

El estándar IEEE 754 especifica que un binario 128 tiene:

Esto proporciona una precisión de entre 33 y 36 dígitos decimales significativos. Si una cadena decimal con un máximo de 33 dígitos significativos se convierte al formato de precisión cuádruple IEEE 754, lo que da como resultado un número normal, y luego se convierte nuevamente a una cadena decimal con el mismo número de dígitos, el resultado final debe coincidir con la cadena original. Si un número de precisión cuádruple IEEE 754 se convierte a una cadena decimal con al menos 36 dígitos significativos y luego se convierte nuevamente a una representación de precisión cuádruple, el resultado final debe coincidir con el número original. [3]

El formato se escribe con un bit de entrada implícito con valor 1 a menos que el exponente se almacene con todos los ceros. Por lo tanto, solo aparecen 112 bits de la mantisa en el formato de memoria, pero la precisión total es de 113 bits (aproximadamente 34 dígitos decimales: log 10 (2 113 ) ≈ 34.016 ). Los bits se distribuyen de la siguiente manera:

Un bit de signo, un exponente de 15 bits y un significado de 112 bits.

Codificación de exponentes

El exponente de punto flotante binario de precisión cuádruple se codifica utilizando una representación binaria de desplazamiento , donde el desplazamiento cero es 16383; esto también se conoce como sesgo de exponente en el estándar IEEE 754.

Por lo tanto, tal como lo define la representación binaria de desplazamiento, para obtener el exponente verdadero, el desplazamiento de 16383 debe restarse del exponente almacenado.

Los exponentes almacenados 0000 16 y 7FFF 16 se interpretan de forma especial.

El valor mínimo estrictamente positivo (subnormal) es 2 −16494 ≈ 10 −4965 y tiene una precisión de solo un bit. El valor normal positivo mínimo es 2 −163823,3621 × 10 −4932 y tiene una precisión de 113 bits, es decir, también ±2 −16494 . El valor máximo representable es 2 16384 − 2 162711,1897 × 10 4932 .

Ejemplos de precisión cuádruple

Estos ejemplos se dan en representación de bits , en hexadecimal , del valor de punto flotante. Esto incluye el signo, el exponente (sesgado) y la mantisa.

0000 0000 0000 0000 0000 0000 0000 0001 16 = 2 −16382 × 2 −112 = 2 −16494 ≈ 6.4751751194380251109244389582276465525 × 10 −4966 (número subnormal positivo más pequeño)
0000 ffff ffff ffff ffff ffff ffff ffff 16 = 2 −16382 × (1 − 2 −112 ) ≈ 3.3621031431120935062626778173217519551 × 10 −4932 (número subnormal más grande)
0001 0000 0000 0000 0000 0000 0000 0000 16 = 2 −16382 ≈ 3,3621031431120935062626778173217526026 × 10 −4932 (número normal positivo más pequeño)
7ffe ffff ffff ffff ffff ffff ffff ffff 16 = 2 16383 × (2 − 2 −112 ) ≈ 1.1897314953572317650857593266280070162 × 10 4932 (número normal más grande)
3ffe ffff ffff ffff ffff ffff ffff ffff ffff 16 = 1 − 2 −113 ≈ 0,9999999999999999999999999999999999037 (número mayor menor que uno)
3fff 0000 0000 0000 0000 0000 0000 0000 16 = 1 (uno)
3fff 0000 0000 0000 0000 0000 0000 0001 16 = 1 + 2 −112 ≈ 1.00000000000000000000000000000000001926 (número más pequeño mayor que uno)
c000 0000 0000 0000 0000 0000 0000 0000 16 = −2
0000 0000 0000 0000 0000 0000 0000 0000 16 = 08000 0000 0000 0000 0000 0000 0000 0000 16 = −0
7fff 0000 0000 0000 0000 0000 0000 0000 16 = infinitoffff 0000 0000 0000 0000 0000 0000 0000 16 = −infinito
4000 921f b544 42d1 8469 898c c517 01b8 16 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 5555 16 ≈ 1/3

De manera predeterminada, 1/3 se redondea hacia abajo como la precisión doble , debido al número impar de bits en la mantisa. Por lo tanto, los bits más allá del punto de redondeo son 0101...que es menor que 1/2 de una unidad en el último lugar .

Aritmética doble-doble

Una técnica de software común para implementar una precisión casi cuádruple usando pares de valores de doble precisión a veces se denomina aritmética doble-doble . [4] [5] [6] Usando pares de valores de doble precisión IEEE con mantisas de 53 bits, la aritmética doble-doble proporciona operaciones en números con mantisas de al menos [4] 2 × 53 = 106 bits (en realidad 107 bits [7] excepto para algunos de los valores más grandes, debido al rango limitado del exponente), solo ligeramente menos precisa que la mantisa de 113 bits de la precisión cuádruple binaria IEEE128. El rango de un doble-doble sigue siendo esencialmente el mismo que el formato de doble precisión porque el exponente todavía tiene 11 bits, [4] significativamente menor que el exponente de 15 bits de la precisión cuádruple IEEE (un rango de 1,8 × 10 308 para doble-doble versus 1,2 × 10 4932 para binario128).

En particular, un valor q de precisión doble-doble/cuádruple en la técnica doble-doble se representa implícitamente como una suma q = x + y de dos valores de precisión doble x e y , cada uno de los cuales proporciona la mitad del mantisa de q . [5] Es decir, el par ( x , y ) se almacena en lugar de q , y las operaciones sobre valores q (+, −, ×, ...) se transforman en operaciones equivalentes (pero más complicadas) sobre los valores x e y . Por lo tanto, la aritmética en esta técnica se reduce a una secuencia de operaciones de precisión doble; dado que la aritmética de precisión doble se implementa comúnmente en hardware, la aritmética doble-doble suele ser sustancialmente más rápida que las técnicas aritméticas de precisión arbitraria más generales . [4] [5]

Obsérvese que la aritmética doble-doble tiene las siguientes características especiales: [8]

Además de la aritmética doble-doble, también es posible generar aritmética triple-doble o cuádruple-doble si se requiere una mayor precisión sin ninguna biblioteca de punto flotante de mayor precisión. Se representan como una suma de tres (o cuatro) valores de doble precisión respectivamente. Pueden representar operaciones con al menos 159/161 y 212/215 bits respectivamente.

Se puede utilizar una técnica similar para producir una aritmética de doble cuadruple , que se representa como una suma de dos valores de precisión cuádruple. Pueden representar operaciones con al menos 226 (o 227) bits. [9]

Implementaciones

La precisión cuádruple se suele implementar en software mediante una variedad de técnicas (como la técnica doble-doble mencionada anteriormente, aunque esa técnica no implementa la precisión cuádruple IEEE), ya que el soporte de hardware directo para precisión cuádruple es, a partir de 2016 , menos común (consulte "Soporte de hardware" a continuación). Se pueden usar bibliotecas aritméticas generales de precisión arbitraria para obtener precisión cuádruple (o superior), pero las implementaciones especializadas de precisión cuádruple pueden lograr un mayor rendimiento.

Soporte de lenguaje informático

Una cuestión aparte es hasta qué punto los tipos de precisión cuádruple se incorporan directamente a los lenguajes de programación informática .

La precisión cuádruple se especifica en Fortran mediante real(real128)( iso_fortran_envse debe utilizar el módulo de Fortran 2008, la constante real128es igual a 16 en la mayoría de los procesadores), o como real(selected_real_kind(33, 4931)), o de una manera no estándar como REAL*16. (La precisión cuádruple REAL*16es compatible con el compilador Fortran de Intel [10] y con el compilador Fortran de GNU [11] en arquitecturas x86 , x86-64 e Itanium , por ejemplo).

Para el lenguaje de programación C , ISO/IEC TS 18661-3 (extensiones de punto flotante para C, tipos de intercambio y extendidos) especifica _Float128como el tipo que implementa el formato de precisión cuádruple IEEE 754 (binary128). [12] Alternativamente, en C / C++ con algunos sistemas y compiladores, la precisión cuádruple puede especificarse mediante el tipo long double , pero esto no es requerido por el lenguaje (que solo requiere long doubleser al menos tan preciso como double), ni es común.

En x86 y x86-64, los compiladores C/C++ más comunes implementan como precisión extendidalong double de 80 bits (por ejemplo, el compilador GNU C gcc [13] y el compilador Intel C++ con un conmutador [14] ) o simplemente como sinónimo de precisión doble (por ejemplo, Microsoft Visual C++ [15] ), en lugar de como precisión cuádruple. El estándar de llamada a procedimiento para la arquitectura ARM de 64 bits (AArch64) especifica que corresponde al formato de precisión cuádruple IEEE 754. [16] En algunas otras arquitecturas, algunos compiladores C/C++ implementan como precisión cuádruple, por ejemplo, gcc en PowerPC (como doble-doble [17] [18] [19] ) y SPARC , [20] o los compiladores Sun Studio en SPARC. [21] Sin embargo, incluso si no es precisión cuádruple, algunos compiladores C/C++ proporcionan un tipo de precisión cuádruple no estándar como extensión. Por ejemplo, gcc proporciona un tipo de precisión cuádruple llamado para CPU x86, x86-64 e Itanium , [22] y en PowerPC como punto flotante IEEE de 128 bits usando las opciones -mfloat128-hardware o -mfloat128; [23] y algunas versiones del compilador C/C++ de Intel para x86 y x86-64 proporcionan un tipo de precisión cuádruple no estándar llamado . [24]/Qlong‑doublelong doublelong doublelong double__float128_Quad

Zig proporciona soporte para ello con su f128tipo. [25]

El lenguaje en desarrollo de Google, Carbon, proporciona soporte para este tipo llamado 'f128'. [26]

A partir de 2024, Rust está trabajando en agregar un nuevo f128tipo para números flotantes de 128 bits de precisión cuádruple IEEE. [27]

Bibliotecas y cajas de herramientas

Soporte de hardware

La precisión cuádruple IEEE se agregó al IBM System/390 G5 en 1998, [32] y es compatible con hardware en procesadores z/Architecture posteriores. [33] [34] La CPU IBM POWER9 ( Power ISA 3.0 ) tiene soporte nativo de hardware de 128 bits. [23]

El soporte nativo de flotantes IEEE de 128 bits está definido en PA-RISC 1.0, [35] y en las arquitecturas SPARC V8 [36] y V9 [37] (por ejemplo, hay 16 registros de precisión cuádruple %q0, %q4, ...), pero ninguna CPU SPARC implementa operaciones de precisión cuádruple en hardware a partir de 2004. [ 38]

La precisión extendida no IEEE (128 bits de almacenamiento, 1 bit de signo, 7 bits de exponente, 112 bits de fracción, 8 bits sin usar) se agregó a la serie IBM System/370 (décadas de 1970 y 1980) y estuvo disponible en algunos modelos System/360 en la década de 1960 (System/360-85, [39] -195 y otros por pedido especial o simulado por el software del sistema operativo).

Los mainframes de las series 7.700 y 7.500 de Siemens y sus sucesores admiten los mismos formatos e instrucciones de punto flotante que los IBM System/360 y System/370.

El procesador VAX implementó un punto flotante de precisión cuádruple no IEEE como su formato de "punto flotante H". Tenía un bit de signo, un exponente de 15 bits y 112 bits de fracción, sin embargo, la disposición en memoria era significativamente diferente de la precisión cuádruple IEEE y el sesgo del exponente también difería. Solo algunos de los primeros procesadores VAX implementaron instrucciones de punto flotante H en hardware, todos los demás emularon el punto flotante H en software.

La arquitectura del motor vectorial NEC permite sumar, restar, multiplicar y comparar números binarios IEEE 754 de precisión cuádruple de 128 bits. [40] Se utilizan dos registros de 64 bits vecinos. La aritmética de precisión cuádruple no es compatible con el registro vectorial. [41]

La arquitectura RISC-V especifica una extensión "Q" (precisión cuádruple) para aritmética de punto flotante IEEE 754-2008 binaria de 128 bits. [42] La extensión "L" (aún no certificada) especificará punto flotante decimal de 64 y 128 bits. [43]

La implementación de hardware de cuádruple precisión (128 bits) no debe confundirse con las "FPU de 128 bits" que implementan instrucciones SIMD , como Streaming SIMD Extensions o AltiVec , que se refieren a vectores de 128 bits de cuatro valores de precisión simple de 32 bits o dos valores de precisión doble de 64 bits que se operan simultáneamente.

Véase también

Referencias

  1. ^ David H. Bailey; Jonathan M. Borwein (6 de julio de 2009). "Computación de alta precisión y física matemática" (PDF) .
  2. ^ Higham, Nicholas (2002). "Diseño de algoritmos estables" en Accuracy and Stability of Numerical Algorithms (Precisión y estabilidad de algoritmos numéricos) (2.ª ed.) . SIAM. pág. 43.
  3. ^ William Kahan (1 de octubre de 1987). "Notas de clase sobre el estado del estándar IEEE 754 para aritmética binaria de punto flotante" (PDF) .
  4. ^ abcd Yozo Hida, X. Li y DH Bailey, Aritmética cuádruple-doble: algoritmos, implementación y aplicación, Informe técnico del Laboratorio Nacional Lawrence Berkeley LBNL-46996 (2000). También Y. Hida et al., Biblioteca para aritmética doble-doble y cuádruple-doble (2007).
  5. ^ abc JR Shewchuk, Aritmética de punto flotante de precisión adaptativa y predicados geométricos robustos y rápidos, Geometría discreta y computacional 18:305–363, 1997.
  6. ^ Knuth, DE El arte de la programación informática (2.ª ed.). capítulo 4.2.3. problema 9.
  7. ^ Robert Munafo F107 y F161 Tipos de datos de punto flotante de alta precisión (2011).
  8. ^ Tipo de datos de punto flotante doble de 128 bits de longitud
  9. ^ sourceware.org Re: El estado de la biblioteca glibc
  10. ^ "Intel Fortran Compiler Product Brief (copia archivada en web.archive.org)" (PDF) . Su. Archivado desde el original el 25 de octubre de 2008 . Consultado el 23 de enero de 2010 .{{cite web}}: CS1 maint: unfit URL (link)
  11. ^ "Serie de versiones GCC 4.6: cambios, nuevas funciones y correcciones" . Consultado el 6 de febrero de 2010 .
  12. ^ "ISO/IEC TS 18661-3" (PDF) . 2015-06-10 . Consultado el 2019-09-22 .
  13. ^ Opciones i386 y x86-64 (copia archivada en web.archive.org), Uso de la colección de compiladores GNU .
  14. ^ Sitio para desarrolladores de Intel
  15. ^ Página de inicio de MSDN, acerca del compilador de Visual C++
  16. ^ "Estándar de llamada a procedimientos para la arquitectura ARM de 64 bits (AArch64)" (PDF) . 2013-05-22. Archivado desde el original (PDF) el 2019-10-16 . Consultado el 2019-09-22 .
  17. ^ Opciones de RS/6000 y PowerPC, uso de la colección de compiladores GNU .
  18. ^ Inside Macintosh - PowerPC Numerics Archivado el 9 de octubre de 2012 en Wayback Machine.
  19. ^ Rutinas de soporte doble de 128 bits de longitud para Darwin
  20. ^ Opciones de SPARC, uso de la colección de compiladores GNU .
  21. ^ Las bibliotecas de matemáticas, Guía de cálculo numérico de Sun Studio 11 (2005).
  22. ^ Tipos flotantes adicionales, utilizando la colección de compiladores GNU
  23. ^ ab "Serie de lanzamiento de GCC 6: cambios, nuevas funciones y correcciones" . Consultado el 13 de septiembre de 2016 .
  24. ^ Foros de Intel C++ (2007).
  25. ^ "Flotas". ziglang.org . Consultado el 7 de enero de 2024 .
  26. ^ "Repositorio principal de Carbon Language - Diseño del lenguaje". GitHub . 2022-08-09 . Consultado el 2022-09-22 .
  27. ^ Cross, Travis. "Problema de seguimiento para los tipos de flotantes f16 y f128". GitHub . Consultado el 5 de julio de 2024 .
  28. ^ "Boost.Multiprecision - float128" . Consultado el 22 de junio de 2015 .
  29. ^ Pavel Holoborodko (20 de enero de 2013). "Cálculos rápidos de precisión cuádruple en MATLAB" . Consultado el 22 de junio de 2015 .
  30. ^ "DoubleFloats.jl". GitHub .
  31. ^ "doubledouble.py". GitHub .
  32. ^ Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de coma flotante S/390 G5". IBM Journal of Research and Development . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . doi :10.1147/rd.435.0707. 
  33. ^ Gerwig, G. y Wetter, H. y Schwarz, EM y Haess, J. y Krygowski, CA y Fleischer, BM y Kroener, M. (mayo de 2004). "La unidad de punto flotante IBM eServer z990. IBM J. Res. Dev. 48; págs. 311-322".{{cite news}}: CS1 maint: multiple names: authors list (link)
  34. ^ Eric Schwarz (22 de junio de 2015). "Los aceleradores IBM z13 SIMD para números enteros, cadenas y coma flotante" (PDF) . Consultado el 13 de julio de 2015 .
  35. ^ "Soporte de implementadores para los formatos de intercambio binario". IEEE . Archivado desde el original el 2017-10-27 . Consultado el 2021-07-15 .
  36. ^ Manual de arquitectura SPARC: versión 8 (copia archivada en web.archive.org) (PDF) . SPARC International, Inc. 1992. Archivado desde el original (PDF) el 2005-02-04 . Consultado el 2011-09-24 . SPARC es una arquitectura de conjunto de instrucciones (ISA) con enteros de 32 bits y coma flotante IEEE Standard 754 de 32, 64 y 128 bits como sus principales tipos de datos.
  37. ^ David L. Weaver; Tom Germond, eds. (1994). The SPARC Architecture Manual: Version 9 (copia archivada en web.archive.org) (PDF) . SPARC International, Inc. Archivado desde el original (PDF) el 2012-01-18 . Consultado el 2011-09-24 . Punto flotante: La arquitectura proporciona un conjunto de instrucciones de punto flotante compatible con IEEE 754, que opera en un archivo de registro separado que proporciona 32 registros de precisión simple (32 bits), 32 de precisión doble (64 bits), 16 de precisión cuádruple (128 bits), o una mezcla de los mismos.
  38. ^ "Comportamiento e implementación de SPARC". Guía de cálculo numérico — Sun Studio 10. Sun Microsystems, Inc. 2004. Consultado el 24 de septiembre de 2011. Sin embargo , existen cuatro situaciones en las que el hardware no completará correctamente una instrucción de punto flotante: ... La instrucción no está implementada por el hardware (como ... instrucciones de precisión cuádruple en cualquier FPU SPARC).
  39. ^ Padegs A (1968). "Aspectos estructurales del System/360 Model 85, III: Extensiones a la arquitectura de punto flotante". IBM Systems Journal . 7 : 22–29. doi :10.1147/sj.71.0022.
  40. ^ Manual de referencia del lenguaje de ensamblaje de Vector Engine, Capítulo 4 Sintaxis del ensamblador página 23.
  41. ^ Guía de arquitectura TSUBASA SX-Aurora Revisión 1.1 (p. 38, 60).
  42. ^ Especificación RISC-V ISA v. 20191213, Capítulo 13, Extensión estándar “Q” para punto flotante de precisión cuádruple, página 79.
  43. ^ [1] Capítulo 15 (p. 95).

Enlaces externos