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 .
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:
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 −16382 ≈ 3,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 16271 ≈ 1,1897 × 10 4932 .
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)
4000 0000 0000 0000 0000 0000 0000 0000 16 = 2c000 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...
los que son menores que 1/2 de una unidad en el último lugar .
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]
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 [update], 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.
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_env
se 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 una manera no estándar como REAL*16
. (La precisión cuádruple REAL*16
es 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 _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 especificarse mediante el tipo long double , pero esto no es requerido por el lenguaje (que solo requiere long double
ser 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‑double
long double
long double
long double
__float128
_Quad
Zig proporciona soporte para ello con su f128
tipo. [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 f128
tipo para números flotantes de 128 bits de precisión cuádruple IEEE. [27]
__float128
y .__complex128
__float128
y _Quad
e incluye una implementación personalizada de la biblioteca matemática estándar. [28]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. [update][ 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.
{{cite web}}
: CS1 maint: unfit URL (link)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.
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.
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).