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 numérico de computadora basado en punto flotante binario que ocupa 16 bytes (128 bits) con una precisión de al menos el doble de la precisión doble de 53 bits .

Esta precisión cuádruple de 128 bits está diseñada no solo 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 manera más confiable y precisa al minimizar el desbordamiento y el redondeo. errores en cálculos intermedios y variables scratch. 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 implementarla para que se ejecute rápidamente; muy pronto dos más bytes 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 a la vista cuando se elaboró ​​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 binario128 .

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

El estándar IEEE 754 especifica que un binario128 tiene:

Esto da una precisión de 33 a 36 dígitos decimales significativos. Si una cadena decimal con como máximo 33 dígitos significativos se convierte al formato de precisión cuádruple IEEE 754, dando un número normal, y luego se vuelve a convertir 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 en una cadena decimal con al menos 36 dígitos significativos y luego se vuelve a convertir 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 inicial implícito con valor 1 a menos que el exponente se almacene solo con ceros. Así, sólo aparecen 112 bits del significado 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 disponen como:

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 desplazada , siendo el desplazamiento cero 16383; esto también se conoce como sesgo de exponente en el estándar IEEE 754.

Por lo tanto, según lo definido por 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 coma flotante. Esto incluye el signo, el exponente (sesgado) y el significado.

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 (mayor número subnormal)
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 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 menor 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 forma predeterminada, 1/3 se redondea hacia abajo como con doble precisión , debido al número impar de bits en el significado. Entonces, los bits más allá del punto de redondeo 0101...son menos de 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 utilizando 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 significados de 53 bits, la aritmética doble-doble proporciona operaciones en números con significados de al menos [4] 2 × 53 = 106 bits (en realidad 107 bits [ 7] excepto por algunos de los valores más grandes, debido al rango limitado del exponente), sólo un poco menos preciso que el significado 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 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 doble-doble/cuádruple precisión en la técnica de doble-doble 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 del significado de q . . [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 x y valores y . Así, 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 de doble doble suele ser sustancialmente más rápida que las técnicas aritméticas de precisión arbitraria más generales . [4] [5]

Tenga en cuenta 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 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 cuádruple , 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 a menudo se implementa en software mediante una variedad de técnicas (como la técnica doble-doble anterior, 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 (ver "Soporte de hardware" a continuación). Se pueden utilizar bibliotecas aritméticas generales de precisión arbitraria para obtener una 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

Cuestión aparte es hasta qué punto los tipos de precisión cuádruple se incorporan directamente a los lenguajes de programación de ordenadores .

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 forma no estándar como REAL*16. (La precisión cuádruple REAL*16es compatible con el compilador Intel Fortran [10] y 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, tipos de intercambio y extendidos) especifica _Float128como el tipo que implementa el formato de precisión cuádruple IEEE 754 (binario128). [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 lo es. es común.

En x86 y x86-64, los compiladores C/C++ más comunes se implementan long doublecomo precisión extendida de 80 bits (por ejemplo, el compilador GNU C gcc [13] y el compilador Intel C++ con un /Qlong‑doublemodificador [14] ) o simplemente como sinónimo de precisión doble (por ejemplo, Microsoft Visual C++ [15] ), en lugar de precisión cuádruple. El estándar de llamada a procedimiento para la arquitectura ARM de 64 bits (AArch64) especifica que long doublecorresponde al formato de precisión cuádruple IEEE 754. [16] En algunas otras arquitecturas, algunos compiladores C/C++ implementan long doublecon precisión cuádruple, por ejemplo, gcc en PowerPC (como doble-doble [17] [18] [19] ) y SPARC , [20] o los compiladores Sun Studio en ESPARC. [21] Sin embargo, incluso si long doubleno es 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 CPU __float128x86, x86-64 e Itanium , [22] y en PowerPC como punto flotante IEEE de 128 bits utilizando las opciones -mfloat128-hardware o -mfloat128; [23] y algunas versiones del compilador C/C++ de Intel para x86 y x86-64 proporcionan un tipo no estándar de precisión cuádruple llamado _Quad. [24]

Zig le brinda soporte con su f128tipo. [25]

Carbon, el lenguaje de trabajo en progreso de Google, lo admite con el tipo llamado 'f128'. [26]

Bibliotecas y cajas de herramientas

Soporte de hardware

La precisión cuádruple IEEE se agregó al IBM System/390 G5 en 1998, [31] y es compatible con el hardware de procesadores z/Architecture posteriores . [32] [33] 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 se define en las arquitecturas PA-RISC 1.0, [34] y SPARC V8 [35] y V9 [36] (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 . [37]

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 a 1980) y estaba disponible en algunos System/360. modelos de la década de 1960 (System/360-85, [38] -195, y otros por pedido especial o simulados por software OS).

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

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

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

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

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 de 32 bits de precisión simple o dos valores de doble precisión de 64 bits que se operan simultáneamente.

Ver 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, Nicolás (2002). "Diseño de algoritmos estables" en Precisión y estabilidad de algoritmos numéricos (2 ed) . SIAM. pag. 43.
  3. ^ William Kahan (1 de octubre de 1987). "Notas de la conferencia sobre el estado del estándar IEEE 754 para aritmética binaria de coma 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 de aritmética doble-doble y cuádruple-doble (2007).
  5. ^ abc JR Shewchuk, Aritmética de coma flotante de precisión adaptativa y predicados geométricos rápidos y robustos, 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 coma flotante doble de 128 bits de largo
  9. ^ sourceware.org Re: El estado de glibc libm
  10. ^ "Resumen del producto Intel Fortran Compiler (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 22 de septiembre de 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 de inicio de MSDN, sobre el compilador de Visual C++
  16. ^ "Estándar de llamada de procedimiento para la arquitectura ARM de 64 bits (AArch64)" (PDF) . 2013-05-22. Archivado desde el 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. ^ Inside Macintosh - PowerPC Numerics Archivado el 9 de octubre de 2012 en Wayback Machine .
  19. ^ Rutinas de doble soporte de 128 bits de largo para Darwin
  20. ^ Opciones SPARC, uso de la colección de compiladores GNU .
  21. ^ Bibliotecas de matemáticas, Guía de computación numérica de Sun Studio 11 (2005).
  22. ^ Tipos flotantes adicionales, utilizando la colección de compiladores GNU
  23. ^ ab "Serie de lanzamientos de GCC 6: cambios, nuevas funciones y correcciones" . Consultado el 13 de septiembre de 2016 .
  24. ^ Foros de Intel C ++ (2007).
  25. ^ "Flotadores". ziglang.org . Consultado el 7 de enero de 2024 .
  26. ^ "Repositorio principal de Carbon Language: diseño de lenguaje". GitHub . 2022-08-09 . Consultado el 22 de septiembre de 2022 .
  27. ^ "Boost.Multiprecisión - float128" . Consultado el 22 de junio de 2015 .
  28. ^ 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 .
  29. ^ "DoubleFloats.jl". GitHub .
  30. ^ "dobledoble.py". GitHub .
  31. ^ Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de punto flotante S/390 G5". Revista IBM de investigación y desarrollo . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . doi :10.1147/rd.435.0707. 
  32. ^ 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)
  33. ^ Eric Schwarz (22 de junio de 2015). "Los aceleradores SIMD IBM z13 para números enteros, cadenas y puntos flotantes" (PDF) . Consultado el 13 de julio de 2015 .
  34. ^ "Soporte del implementador para los formatos de intercambio binario". grupoer.ieee.org . Archivado desde el original el 27 de octubre de 2017 . Consultado el 15 de julio de 2021 .
  35. ^ Manual de arquitectura SPARC: versión 8 (copia archivada en web.archive.org) (PDF) . SPARC International, Inc. 1992. Archivado desde el 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 números enteros de 32 bits y puntos flotantes IEEE Standard 754 de 32, 64 y 128 bits como tipos de datos principales.
  36. ^ David L. Weaver; Tom Germond, eds. (1994). Manual de arquitectura SPARC: versión 9 (copia archivada en web.archive.org) (PDF) . SPARC International, Inc. Archivado desde el original (PDF) el 18 de enero de 2012 . Consultado el 24 de septiembre de 2011 . 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 de precisión simple (32 bits), 32 de doble precisión (64 bits) y 16 de precisión cuádruple. (128 bits) o una combinación de ellos.
  37. ^ "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, hay cuatro situaciones en las que el hardware no completa con éxito una instrucción de punto flotante: ... La instrucción no es implementada por el hardware (como ... instrucciones de precisión cuádruple en cualquier FPU SPARC).
  38. ^ Padegs A (1968). "Aspectos estructurales del System/360 Model 85, III: Extensiones a la arquitectura de punto flotante". Revista de sistemas IBM . 7 : 22-29. doi :10.1147/sj.71.0022.
  39. ^ Manual de referencia del lenguaje de ensamblaje del motor vectorial, capítulo 4, sintaxis del ensamblador, página 23.
  40. ^ Guía de arquitectura SX-Aurora TSUBASA Revisión 1.1 (p. 38, 60).
  41. ^ 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.
  42. ^ [1] Capítulo 15 (pág. 95).

enlaces externos