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 .
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 un máximo de 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:
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 −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 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 .
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]
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 [update], 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.
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_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 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, tipos de intercambio y extendidos) especifica _Float128
como 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 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
modificador [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 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 Sun Studio en ESPARC. [21] Sin embargo, incluso si long double
no 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 __float128
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 no estándar de precisión cuádruple llamado _Quad
. [24]
Zig le brinda soporte con su f128
tipo. [25]
Carbon, el lenguaje de trabajo en progreso de Google, lo admite con el tipo llamado 'f128'. [26]
A partir de 2024, Rust está trabajando actualmente para agregar un nuevo f128
tipo para flotantes de 128 bits de precisión cuádruple IEEE. [27]
__float128
, libquadmath, proporciona operaciones __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 el hardware de 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 se define en las arquitecturas PA-RISC 1.0, [35] y 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 a 1980) y estaba disponible en algunos System/360. modelos de la década de 1960 (System/360-85, [39] -195 y otros por pedido especial o simulados mediante software del sistema operativo).
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 H de punto flotante 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. [40] Se utilizan dos registros vecinos 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" (precisión cuádruple) para la aritmética de punto flotante binario IEEE 754-2008 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 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.
{{cite web}}
: CS1 maint: unfit URL (link){{cite news}}
: CS1 maint: multiple names: authors list (link)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.
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), 16 de precisión cuádruple. (128 bits) o una combinación de ellos.
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).