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 en 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 minimizando el desbordamiento y el redondeo. errores en cálculos intermedios y variables de scratch. William Kahan , arquitecto principal del estándar de coma flotante IEEE-754 original, señaló: "Por ahora, el formato extendido de 10 byteses un compromiso tolerable entre el valor de la aritmética extra precisa y el precio de implementarla para que funcione rápidamente; muy pronto dos bytes más de precisión serán tolerables, y finalmente 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 enmarcó 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 de coma flotante binario de precisión cuádruple IEEE 754: binary128
El estándar IEEE 754 especifica que un binary128 tiene:
- Bit de signo : 1 bit
- Ancho de exponente : 15 bits
- Precisión significativa : 113 bits (112 almacenados explícitamente)
Esto da una precisión de 33 a 36 dígitos decimales significativos. Si una cadena decimal con un máximo de 33 dígitos significativos se convierte a una representación de precisión cuádruple IEEE 754 y luego se vuelve a convertir en 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 con todos los ceros. Por lo tanto sólo 112 bits de la mantisa aparecen en el formato de la memoria, pero la precisión total es 113 bits (dígitos aproximadamente 34 decimales: log 10 (2 113 ) ≈ 34.016 ). Los bits se presentan como:
Un binary256 tendría una precisión significativa de 237 bits (aproximadamente 71 dígitos decimales) y un sesgo de exponente 262143.
Codificación de exponentes
El exponente binario de coma flotante de precisión cuádruple se codifica utilizando una representación binaria de desplazamiento , siendo el desplazamiento cero 16383; esto también se conoce como sesgo de exponente en el estándar IEEE 754.
- E min = 0001 16 - 3FFF 16 = −16382
- E máx = 7FFE 16 - 3FFF 16 = 16383
- Sesgo de exponente = 3FFF 16 = 16383
Por lo tanto, según lo definido por la representación binaria de compensación, para obtener el exponente verdadero, la compensación de 16383 debe restarse del exponente almacenado.
Los exponentes almacenados 0000 16 y 7FFF 16 se interpretan especialmente.
Exponente | Significand cero | Significativo y distinto de cero | Ecuación |
---|---|---|---|
0000 16 | 0 , −0 | números subnormales | (−1) bit de signo × 2 −16382 × 0 bits de signo 2 |
0001 16 , ..., 7FFE 16 | valor normalizado | (−1) bit de signo × 2 bits de exponente 2 - 16383 × 1 bits significativos 2 | |
7FFF 16 | ± ∞ | NaN (silencioso, señalización) |
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 −16382 ≈ 3,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 16271 ≈ 1,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, exponente (sesgado) y significando.
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 (mayor número normal)
3ffe ffff ffff ffff ffff ffff ffff ffff 16 = 1 - 2 −113 ≈ 0.9999999999999999999999999999999999037 (número más grande menos de 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.0000000000000000000000000000000001926 (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
Por defecto, 1/3 se redondea hacia abajo como doble precisión , debido al número impar de bits en el significado. Entonces, los bits más allá del punto de redondeo son 0101...
menos de la mitad 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] Utilizando pares de valores IEEE de doble precisión con significados de 53 bits, la aritmética doble-doble proporciona operaciones sobre 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 de exponente limitado), solo un poco menos preciso que el significado de 113 bits de la precisión cuádruple de IEEE binary128. El rango de un doble-doble sigue siendo esencialmente el mismo que el del formato de doble precisión porque el exponente todavía tiene 11 bits, [4] significativamente más bajo 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 binary128).
En particular, un valor doble-doble / cuádruple precisión q en la técnica de doble-doble se representa implícitamente como una suma q = x + y de los dos valores de precisión doble x y y , cada uno de los cuales suministra la mitad de q 's significand . [5] Es decir, el par ( x , y ) se almacena en lugar de q , y las operaciones sobre q valores (+, -, ×, ...) se transforman en operaciones equivalentes (pero más complicadas) sobre 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 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]
- A medida que disminuye la magnitud del valor, también disminuye la cantidad de precisión adicional. Por lo tanto, el número más pequeño en el rango normalizado es más estrecho que la precisión doble. El número más pequeño con total precisión es 1000 ... 0 2 (106 ceros) × 2 −1074 , o 1.000 ... 0 2 (106 ceros) × 2 −968 . Los números cuya magnitud sea menor que 2 −1021 no tendrán precisión adicional en comparación con la precisión doble.
- 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 es mayor que la mitad de ULP de la parte de orden superior. Si la parte de orden inferior es menos de la mitad de ULP de la parte de orden superior, los bits significativos (todos 0 o todos 1) están implícitos entre los números significativos de orden superior y de orden inferior. Ciertos algoritmos que se basan en tener un número fijo de bits en el significado pueden fallar cuando se utilizan números dobles de 128 bits de longitud.
- 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 doble-doble, también es posible generar aritmética triple-doble o cuádruple-doble si se requiere una mayor precisión sin una biblioteca de coma 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 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 de computadora
Una pregunta aparte es hasta qué punto los tipos de precisión cuádruple se incorporan directamente a los lenguajes de programación de computadoras .
La precisión cuádruple se especifica en Fortran mediante el real(real128)
(se iso_fortran_env
debe utilizar el módulo de Fortran 2008, la constante real128
es 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*16
es 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, intercambio y tipos extendidos) especifica _Float128
como 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 ser especificada por el tipo doble largo , pero esto no es requerido por el lenguaje (que solo requiere long double
ser 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 double
como precisión extendida de 80 bits (por ejemplo, el compilador GNU C gcc [13] y el compilador Intel C ++ con un /Qlong‑double
conmutador [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 double
corresponde al formato de precisión cuádruple IEEE 754. [16] En algunas otras arquitecturas, algunos compiladores de C / C ++ implementan long double
con precisión cuádruple, por ejemplo, gcc en PowerPC (como doble-doble [17] [18] [19] ) y SPARC , [20] o los compiladores de Sun Studio en SPARC. [21] Sin long double
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 __float128
para CPU x86, 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 de precisión cuádruple no estándar llamado _Quad
. [24]
Bibliotecas y cajas de herramientas
- La biblioteca matemática de precisión cuádruple de GCC , libquadmath , proporciona
__float128
y__complex128
operaciones. - La biblioteca de multiprecisión de Boost Boost.Multiprecision proporciona una interfaz C ++ multiplataforma unificada para
__float128
y_Quad
tipos, e incluye una implementación personalizada de la biblioteca matemática estándar. [25] - La caja de herramientas de computación multiprecisión para MATLAB permite cálculos de precisión cuádruple en MATLAB . Incluye funcionalidad aritmética básica, así como métodos numéricos, álgebra lineal densa y dispersa. [26]
- El paquete DoubleDouble [27] proporciona soporte para cálculos doble-doble para el lenguaje de programación Julia.
- La biblioteca doubledouble.py [28] permite cálculos doble-doble 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). [ cita requerida ]
Soporte de hardware
La precisión cuádruple IEEE se agregó al IBM S / 390 G5 en 1998, [29] y es compatible con el hardware de los siguientes procesadores z / Architecture . [30] [31] La CPU IBM POWER9 ( Power ISA 3.0 ) tiene soporte de hardware nativo de 128 bits. [23]
El soporte nativo de flotantes IEEE de 128 bits se define en PA-RISC 1.0, [32] y en las arquitecturas SPARC V8 [33] y V9 [34] (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[actualizar]. [35]
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 (1970-1980) y estaba disponible en algunos S / 360 modelos en la década de 1960 (S / 360-85, [36] -195, y otros por pedido especial o simulados por software OS).
El procesador VAX implementó un punto flotante de precisión cuádruple que no es 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, el diseño en la memoria era significativamente diferente de la precisión cuádruple de IEEE y el sesgo del exponente también difería. Solo algunos de los primeros procesadores VAX implementaron instrucciones de punto flotante H en el hardware, todos los demás emularon el punto flotante H en el software.
La arquitectura RISC-V especifica una extensión "Q" (precisión cuádruple) para aritmética binaria de coma flotante IEEE 754-2008 de 128 bits. [37] La extensión "L" (aún no certificada) especificará coma flotante decimal de 64 y 128 bits. [38]
La implementación de hardware de precisión cuádruple (128 bits) no debe confundirse con "FPU de 128 bits" que implementan instrucciones SIMD , como Streaming SIMD Extensions o AltiVec , que se refiere a vectores de 128 bits de cuatro 32 bits de precisión simple o dos valores de doble precisión de 64 bits que se operan simultáneamente.
Ver también
- IEEE 754 , estándar IEEE para aritmética de punto flotante
- ISO / IEC 10967 , aritmética independiente del idioma
- Tipo de datos primitivo
Referencias
- ^ David H. Bailey; Jonathan M. Borwein (6 de julio de 2009). "Computación de alta precisión y física matemática" (PDF) .
- ^ Higham, Nicholas (2002). "Diseño de algoritmos estables" en Precisión y estabilidad de algoritmos numéricos (2 ed) . SIAM. pag. 43.
- ^ William Kahan (1 de octubre de 1987). "Notas de la conferencia sobre el estado del estándar IEEE 754 para aritmética de coma flotante binaria" (PDF) .
- ^ a b c d 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).
- ^ a b c 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.
- ^ Knuth, DE El arte de la programación informática (2ª ed.). capítulo 4.2.3. problema 9.
- ^ Tipos de datos de punto flotante de alta precisión de Robert Munafo F107 y F161 (2011).
- ^ Tipo de datos de coma flotante doble de 128 bits de largo
- ^ sourceware.org Re: El estado de glibc libm
- ^ "Resumen del producto del compilador Intel Fortran (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 .CS1 maint: URL no apta ( enlace )
- ^ "Serie de versiones GCC 4.6 - Cambios, nuevas funciones y correcciones" . Consultado el 6 de febrero de 2010 .
- ^ "ISO / IEC TS 18661-3" (PDF) . 2015-06-10 . Consultado el 22 de septiembre de 2019 .
- ^ Opciones i386 y x86-64 (copia archivada en web.archive.org) , Uso de la colección de compiladores GNU .
- ^ Sitio para desarrolladores de Intel
- ^ Página de inicio de MSDN, sobre el compilador de Visual C ++
- ^ "Estándar de llamada a 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 .
- ^ Opciones de RS / 6000 y PowerPC , usando la colección de compiladores GNU .
- ^ Inside Macintosh - PowerPC Numerics Archivado el 9 de octubre de 2012 en Wayback Machine.
- ^ Rutinas de doble soporte de 128 bits de largo para Darwin
- ^ Opciones SPARC , usando la colección del compilador GNU .
- ^ Las bibliotecas de matemáticas , Guía de cálculo numérico de Sun Studio 11(2005).
- ^ Tipos flotantes adicionales , usando la colección del compilador GNU
- ^ a b "Serie de versiones GCC 6: cambios, nuevas funciones y correcciones" . Consultado el 13 de septiembre de 2016 .
- ^ Foros de Intel C ++ (2007).
- ^ "Boost.Multiprecision - float128" . Consultado el 22 de junio de 2015 .
- ^ 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 .
- ^ "DoubleDouble.jl" .
- ^ "doubledouble.py" .
- ^ Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de coma flotante S / 390 G5" . Revista de investigación y desarrollo de IBM . 43 (6/5): 707–721. doi : 10.1147 / rd.435.0707 . Consultado el 10 de octubre de 2020 .
- ^ 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".CS1 maint: varios nombres: lista de autores ( enlace )
- ^ Eric Schwarz (22 de junio de 2015). "Los aceleradores IBM z13 SIMD para enteros, cadenas y punto flotante" (PDF) . Consultado el 13 de julio de 2015 .
- ^ Soporte del implementador para los formatos de intercambio binario
- ^ El 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 24 de septiembre de 2011 .
SPARC es una arquitectura de conjunto de instrucciones (ISA) con un entero de 32 bits y un punto flotante IEEE Standard 754 de 32, 64 y 128 bits como sus principales tipos de datos.
- ^ David L. Weaver; Tom Germond, eds. (1994). El 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 precisión doble (64 bits), 16 de precisión cuádruple (128 bits) registros, o una mezcla de los mismos.
- ^ "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 satisfactoriamente una instrucción de punto flotante: ... El hardware no implementa la instrucción (como ... instrucciones de precisión cuádruple en cualquier SPARC FPU).
- ^ Padegs A (1968). "Aspectos estructurales del System / 360 Model 85, III: Extensiones a la arquitectura de punto flotante". Revista de sistemas de IBM . 7 : 22-29. doi : 10.1147 / sj.71.0022 .
- ^ Especificación RISC-V ISA v. 20191213 , Capítulo 13, Extensión estándar “Q” para coma flotante de precisión cuádruple, página 79.
- ^ [1] Capítulo 15 (p. 95).
enlaces externos
- Directorio de software de alta precisión
- QPFloat , una biblioteca de software de software gratuito ( GPL ) para aritmética de precisión cuádruple
- HPAlib , una biblioteca de software de software gratuito ( 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