Articulo de referencia

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 numérico de computadora basado en punto flotante binario que ocupa 16 bytes ( 128 bits ) con una p...

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

Esta precisión cuádruple de 128 bits está diseñada para aplicaciones que necesitan resultados con una precisión superior a la doble, [ 1 ] y, como función principal, para permitir el cálculo de resultados de doble precisión de forma más fiable y precisa, minimizando los errores de desbordamiento y redondeo en los cálculos intermedios y las variables temporales. William Kahan , arquitecto principal del estándar original de punto flotante IEEE 754, señaló: «Por ahora, el formato extendido de 10 bytes es un compromiso aceptable entre el valor de la aritmética de precisión extra y el coste de implementarla para que sea rápida; muy pronto, dos bytes más de precisión serán aceptables, y finalmente un formato de 16 bytes… Ese tipo de evolución gradual hacia una mayor precisión ya estaba prevista cuando se elaboró ​​el estándar IEEE 754 para aritmética de punto flotante ». [ 2 ]

En la norma IEEE 754-2008, el formato de 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 binary128 tiene:

El bit de signo determina el signo del número (incluso cuando este número es cero, que es negativo ). "1" representa el signo negativo.

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, dando como resultado un número normal, y luego se vuelve a convertir a una cadena decimal con la misma cantidad de dígitos, el resultado final debería 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 vuelve a convertir a la 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 arranque implícito con valor 1, a menos que el exponente se almacene con todos ceros (utilizado para codificar números subnormales y 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 ) para valores normales; los subnormales tienen una precisión que se degrada gradualmente hasta 1 bit para el valor distinto de cero más pequeño. Los bits se disponen de la siguiente manera:

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

Codificación exponencial

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

  • E mín = 0001 16 − 3FFF 16 = −16382
  • E máx = 7FFE 16 − 3FFF 16 = 16383
  • Sesgo del exponente = 3FFF 16 = 16383

Por lo tanto, según lo define la representación binaria de desplazamiento, para obtener el exponente verdadero, se debe restar el desplazamiento de 16383 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 mínimo positivo normal es 2 −163823,3621 × 10 −4932 y tiene una precisión de 113  bits, es decir, ±2 −16494 también. El valor máximo representable es 2 16384 − 2 162711,1897 × 10 4932 .

Ejemplos de precisión cuádruple

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

Por defecto, 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 se llama a veces 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 un poco menos precisa que la mantisa de 113 bits de la precisión cuádruple IEEE binary128. El rango de un doble-doble permanece esencialmente igual 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 frente a 1,2 × 10 4932 para binario128).

En particular, un valor de doble precisión/cuádruple precisión q en la técnica de doble precisión se representa implícitamente como una suma q = x + y de dos valores de doble precisión x e y , cada uno de los cuales proporciona la mitad de q.mantisa de . [ 5 ] Es decir, el par ( x , y ) se almacena en lugar de q , y las operaciones sobre los valores de q (+, −, ×, …) se transforman en operaciones equivalentes (pero más complicadas) sobre los valores de x e y . Por lo tanto, la aritmética en esta técnica se reduce a una secuencia de operaciones de doble precisión; dado que la aritmética de doble precisión 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 ]

Nótese que la aritmética doble-doble tiene las siguientes características especiales: [ 8 ]

  • A medida que disminuye la magnitud del valor, también disminuye la precisión adicional. Por lo tanto, el número más pequeño en el rango normalizado es más estrecho que la doble precisión. El número más pequeño con precisión completa es 1000… (10⁶ ceros) × 2⁻¹⁰⁷⁴ , o 1,000… (10⁶ ceros) × 2⁻⁹⁶⁸ . Los números cuya magnitud sea menor que 2⁻¹⁰²¹ no tendrán precisión adicional en comparación con la doble precisión.
  • El número real de bits de precisión puede variar. En general, la magnitud de la parte de orden inferior del número no supera la mitad de la ULP de la parte de orden superior. Si la parte de orden inferior es menor que la mitad de la ULP de la parte de orden superior, se implican bits significativos (todos ceros o todos unos) entre la mantisa de los números de orden superior e inferior. Ciertos algoritmos que dependen de un número fijo de bits en la mantisa pueden fallar al usar números de doble precisión de 128 bits.
  • Debido a la razón anterior, es posible representar valores como 1 + 2 −1074 , que es el número representable más pequeño mayor que 1.

Además de la aritmética de doble precisión, también es posible generar aritmética de triple precisión o cuádruple precisión si se requiere mayor precisión sin necesidad de una biblioteca de punto flotante de alta precisión. Estas se representan como la suma de tres (o cuatro) valores de doble precisión, respectivamente. Pueden representar operaciones con al menos 159/161 y 212/215 bits, respectivamente. Una extensión natural a un número arbitrario de términos (aunque limitada por el rango del exponente) se denomina expansión de punto flotante .

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

Implementaciones

La precisión cuádruple se implementa a menudo en software mediante diversas 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 directo de hardware para la precisión cuádruple es, a partir de 2016, menos común (véase " Soporte de hardware " más abajo). 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

Otra cuestión 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_envdebe utilizarse 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 forma no estándar como REAL*16. (La precisión cuádruple REAL*16es compatible con el compilador Intel Fortran [ 10 ] y con el compilador GNU Fortran [ 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, intercambio y tipos 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 doubleque sea al menos tan preciso como double), ni es común.

A partir de C++23 , el lenguaje C++ define un <stdfloat>archivo de cabecera que contiene tipos de coma flotante de ancho fijo. Las implementaciones de estos tipos son opcionales, pero si se admiten, std::float128_tcorresponden a precisión cuádruple.

En x86 y x86-64, los compiladores C/C++ más comunes implementan como precisión extendida delong double 80 bits (por ejemplo, el compilador GNU C gcc [ 13 ] y el compilador Intel C++ con un interruptor [ 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, aunque no sea de precisión cuádruple, algunos compiladores de 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 las 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 de C/C++ de Intel para x86 y x86-64 proporcionan un tipo de precisión cuádruple no estándar llamado . [ 24 ]/Qlongdoublelong doublelong doublelong double__float128_Quad

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

El lenguaje Carbon de Google, aún en desarrollo, ofrece soporte para ello con el tipo llamado f128. [ 26 ]

A partir de 2026, Rust está trabajando en la incorporación de un nuevo f128tipo para números de coma flotante de 128 bits de precisión cuádruple IEEE. [ 27 ]

Bibliotecas y cajas de herramientas

  • La biblioteca matemática de precisión cuádruple de GCC , libquadmath , proporciona __float128operaciones __complex128.
  • La biblioteca Boost multiprecision Boost.Multiprecision proporciona una interfaz C++ multiplataforma unificada para tipos __float128y _Quad, e incluye una implementación personalizada de la biblioteca matemática estándar. [ 28 ]
  • La caja de herramientas de computación de precisión múltiple para MATLAB permite realizar cálculos de precisión cuádruple en MATLAB . Incluye funcionalidades aritméticas básicas, así como métodos numéricos y álgebra lineal densa y dispersa. [ 29 ]
  • El paquete DoubleFloats [ 30 ] proporciona soporte para cálculos de doble precisión para el lenguaje de programación Julia.
  • La biblioteca doubledouble.py [ 31 ] permite realizar cálculos de doble precisión en Python.
  • Mathematica admite números de precisión cuádruple IEEE: valores de punto flotante de 128 bits (Real128) y valores complejos de 256 bits (Complex256).

Soporte de hardware

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

La compatibilidad nativa con números de coma flotante IEEE de 128 bits está definida 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 a pedido especial o simulados por el software del sistema operativo).

Los ordenadores centrales Siemens de las series 7.700 y 7.500, así como sus sucesores, admiten los mismos formatos e instrucciones de coma flotante que los sistemas IBM System/360 y System/370.

El procesador VAX implementó la coma flotante de precisión cuádruple no IEEE bajo su formato "H Floating-point". Contaba con 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 a la de precisión cuádruple IEEE, y el sesgo del exponente también difería. Solo algunos de los primeros procesadores VAX implementaron instrucciones de coma flotante H en hardware; todos los demás emularon la coma flotante H en software.

La arquitectura del motor vectorial de NEC admite la suma, resta, multiplicación y comparación de números binarios IEEE 754 de 128 bits de precisión cuádruple. [ 40 ] Se utilizan dos registros adyacentes de 64 bits. 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" (cuádruple precisión) para aritmética de punto flotante binaria de 128 bits IEEE 754-2008. [ 42 ] La extensión "L" (aún no certificada) especificará punto flotante decimal de 64 bits y 128 bits. [ 43 ]

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

Véase también

Referencias

  1. Bailey, David H.; Borwein, Jonathan M. (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 Precisión y estabilidad de algoritmos numéricos (2.ª ed.) . SIAM. pág. 43. 
  3. Kahan, Wiliam (1 de octubre de 1987). "Notas de clase sobre el estado de la norma IEEE 754 para aritmética binaria de punto flotante" (PDF) .
  4. 1 2 3 4 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. 1 2 3 J. R. Shewchuk, Aritmética de punto flotante de precisión adaptativa y predicados geométricos robustos 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. Tipos de datos de punto flotante de alta precisión F107 y F161 (2011).
  8. Tipo de datos de punto flotante doble largo de 128 bits .
  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 del original el 25 de octubre de 2008. Recuperado el 23 de enero de 2010 .
  11. "Serie de lanzamientos de GCC 4.6: cambios, nuevas características y correcciones" . Consultado el 6 de febrero de 2010 .
  12. "ISO/IEC TS 18661-3" (PDF) . 10-06-2015 . Consultado el 22-09-2019 .
  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 principal de MSDN, sobre el compilador Visual C++ .
  16. "Estándar de llamada a procedimiento para la arquitectura ARM de 64 bits (AArch64)" (PDF) . 22 de mayo de 2013. Archivado del original (PDF) el 16 de octubre de 2019. Consultado el 22 de septiembre de 2019 .
  17. Opciones de RS/6000 y PowerPC , utilizando la colección de compiladores GNU .
  18. Dentro de Macintosh: Datos numéricos de PowerPC . Archivado el 9 de octubre de 2012 en Wayback Machine .
  19. Rutinas de soporte de doble precisión de 128 bits para Darwin Archivado el 07/11/2017 en Wayback Machine .
  20. Opciones 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 de punto flotante adicionales , utilizando la colección del compilador GNU
  23. 1 2 "Serie de lanzamientos de GCC 6: cambios, nuevas características y correcciones" . Consultado el 13 de septiembre de 2016 .
  24. Foros de Intel C++ (2007).
  25. "Floats" . ziglang.org . Consultado el 7 de enero de 2024 .
  26. "Repositorio principal de Carbon Language - Diseño del lenguaje" . GitHub . 9 de agosto de 2022. Consultado el 22 de septiembre de 2022 .
  27. Cross, Travis. "Seguimiento de un problema con los tipos de punto flotante f16 y f128" . GitHub . Consultado el 5 de julio de 2024 .
  28. "Boost.Multiprecision – float128" . Consultado el 22 de junio de 2015 .
  29. Holoborodko, Pavel (2013-01-20). "Cálculos rápidos de precisión cuádruple en MATLAB" . Recuperado el 22-06-2015 .
  30. "DoubleFloats.jl" . GitHub .
  31. «dobledoble.py» . GitHub .
  32. Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de punto 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.; Más húmedo, H.; Schwarz, EM; Haess, J.; Krygowski, California; Fleischer, BM; Kroener, M. (mayo de 2004). "La unidad de punto flotante IBM eServer z990. IBM J. Res. Dev. 48". págs. 311 a 322. 
  34. Schwarz, Eric (22 de junio de 2015). "Los aceleradores SIMD IBM z13 para enteros, cadenas y punto flotante" (PDF) . Archivado del original (PDF) el 13 de julio de 2015. Recuperado el 13 de julio de 2015 .
  35. "Soporte para implementadores de formatos de intercambio binario" . IEEE . Archivado del original el 27 de octubre de 2017. Consultado el 15 de julio de 2021 .
  36. Manual de la arquitectura SPARC: Versión 8 (copia archivada en web.archive.org) (PDF) . SPARC International, Inc. 1992. Archivado del original (PDF) el 4 de febrero de 2005. Consultado el 24 de septiembre de 2011. SPARC es una arquitectura de conjunto de instrucciones (ISA) con enteros de 32 bits y números de coma flotante IEEE Standard 754 de 32, 64 y 128 bits como sus principales tipos de datos.
  37. Weaver, David L.; Germond, Tom, eds. (1994). The SPARC Architecture Manual: Version 9 (archived copy on web.archive.org) (PDF) . SPARC International, Inc. Archivado del original (PDF) el 18-01-2012 . Recuperado el 24-09-2011 . Punto flotante: La arquitectura proporciona un conjunto de instrucciones de punto flotante compatible con IEEE 754, que opera en un archivo de registros separado que proporciona 32 registros de precisión simple (32 bits), 32 de doble precisión (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 computación numérica 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 … las instrucciones de precisión cuádruple en cualquier FPU de SPARC).
  39. Padegs, A. (1968). "Aspectos estructurales del modelo System/360 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 ensamblador de Vector Engine , Capítulo 4 Sintaxis del ensamblador página 23.
  41. Guía de arquitectura SX-Aurora TSUBASA Revisión 1.1 , págs. 38, 60.
  42. Especificación RISC-V ISA v. 20191213 , Capítulo 13, Extensión del estándar “Q” para punto flotante de precisión cuádruple, página 79.
  43. Capítulo 15, pág. 95.
  • Directorio de software de alta precisión
  • QPFloat , una biblioteca de software libre ( GPL ) para aritmética de cuádruple precisión.
  • HPAlib , una biblioteca de software libre ( LGPL ) para aritmética de precisión cuádruple.
  • libquadmath , la biblioteca matemática de precisión cuádruple de GCC
  • Análisis IEEE-754 , página web interactiva para examinar valores de punto flotante binary32, binary64 y binary128.