Formato de coma flotante de precisión cuádruple - Quadruple-precision floating-point format

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, 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 los errores de desbordamiento y redondeo en intermedios cálculos y variables de 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 extra precisa y el precio de implementarlo 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 enmarcó el estándar IEEE 754 para aritmética de coma flotante ".

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:

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 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.

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 bit de signo, un exponente de 15 bits y un significando de 112 bits

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 −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 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 000116 = 2−16382 × 2−112 = 2−16494
                                          ≈ 6.4751751194380251109244389582276465525 × 10−4966
                                            (smallest positive subnormal number)
0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112)
                                          ≈ 3.3621031431120935062626778173217519551 × 10−4932
                                            (largest subnormal number)
0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382
                                          ≈ 3.3621031431120935062626778173217526026 × 10−4932
                                            (smallest positive normal number)
7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112)
                                          ≈ 1.1897314953572317650857593266280070162 × 104932
                                            (largest normal number)
3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113
                                          ≈ 0.9999999999999999999999999999999999037
                                            (largest number less than one)
3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (one)
3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112
                                          ≈ 1.0000000000000000000000000000000001926
                                            (smallest number larger than one)
c000 0000 0000 0000 0000 0000 0000 000016 = −2
0000 0000 0000 0000 0000 0000 0000 000016 = 0
8000 0000 0000 0000 0000 0000 0000 000016 = −0
7fff 0000 0000 0000 0000 0000 0000 000016 = infinity
ffff 0000 0000 0000 0000 0000 0000 000016 = −infinity
4000 921f b544 42d1 8469 898c c517 01b816 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 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 . Utilizando pares de valores de doble precisión IEEE con significados de 53 bits, la aritmética doble-doble proporciona operaciones sobre números con significados de al menos 2 × 53 = 106 bits (en realidad, 107 bits excepto por algunos de los valores más grandes, debido al exponente limitado rango), solo un poco menos preciso que el significado de 113 bits de 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, 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 . Es decir, el par ( x , y ) se almacena en lugar de q , y las operaciones sobre los valores q (+, -, ×, ...) se transforman en operaciones equivalentes (pero más complicadas) sobre los valores x e 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 .

Tenga en cuenta que la aritmética doble-doble tiene las siguientes características especiales:

  • 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 (ya sea todos 0 o todos 1) están implícitos entre el significativo de los números 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 la suma de dos valores de precisión cuádruple. Pueden representar operaciones con al menos 226 (o 227) bits.

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 está especificada en Fortran por el real(real128)(se iso_fortran_envdebe usar 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 una manera no estándar como REAL*16. (La precisión cuádruple REAL*16es compatible con el compilador Intel Fortran y el compilador GNU Fortran 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). 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 doubleser al menos tan preciso como double), ni 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 y el compilador Intel C ++ con un /Qlong‑doubleconmutador) o simplemente como sinónimos de doble precisión (por ejemplo, Microsoft Visual C ++ ), en lugar de una 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. En algunas otras arquitecturas, algunos compiladores de C / C ++ implementan long doublecon precisión cuádruple, por ejemplo, gcc en PowerPC (como doble-doble) y SPARC , o los compiladores de Sun Studio en SPARC. Sin long doubleembargo, 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 __float128para CPU x86, x86-64 e Itanium , y en PowerPC como punto flotante IEEE de 128 bits utilizando las opciones -mfloat128-hardware o -mfloat128; 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.

Bibliotecas y cajas de herramientas

  • La biblioteca matemática de precisión cuádruple de GCC , libquadmath , proporciona __float128y __complex128operaciones.
  • La biblioteca de multiprecisión de Boost Boost.Multiprecision proporciona una interfaz C ++ multiplataforma unificada para __float128y _Quadtipos, e incluye una implementación personalizada de la biblioteca matemática estándar.
  • 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.
  • El paquete DoubleFloats proporciona soporte para cálculos doble-doble para el lenguaje de programación Julia.
  • La biblioteca doubledouble.py 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).

Soporte de hardware

La precisión cuádruple IEEE se agregó al IBM S / 390 G5 en 1998 y es compatible con el hardware de los siguientes procesadores z / Architecture . La CPU IBM POWER9 ( Power ISA 3.0 ) tiene soporte de hardware nativo de 128 bits.

El soporte nativo de flotantes IEEE de 128 bits se define en PA-RISC 1.0 y en las arquitecturas SPARC V8 y V9 (por ejemplo, hay 16 registros de precisión cuádruple% q0,% q4, ...), pero ninguna CPU SPARC implementa cuádruple operaciones de precisión en hardware a partir de 2004.

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, -195, y otros bajo 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. La extensión "L" (aún no certificada) especificará coma flotante decimal de 64 bits y 128 bits.

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

Referencias

enlaces externos