Na computação, a precisão quádrupla (ou precisão quad) é um formato de número de computador baseado em ponto flutuante binário que ocupa 16 bytes (128 bits) com precisão de pelo menos o dobro da precisão dupla de 53 bits.

Esta precisão quádrupla de 128 bits foi projetada para aplicações que necessitam de resultados com precisão maior que a dupla, e como uma função primária, para permitir a computação de resultados de precisão dupla de forma mais confiável e precisa, minimizando erros de transbordo (overflow) e erros de arredondamento em cálculos intermediários e variáveis temporárias. William Kahan, o principal arquiteto do padrão original de ponto flutuante IEEE 754 observou: "Por enquanto, o formato estendido de 10 bytes é um compromisso tolerável entre o valor da aritmética extraprecisa e o preço de implementá-la para rodar rápido; muito em breve, mais dois bytes de precisão se tornarão toleráveis e, por fim, um formato de 16 bytes ... Esse tipo de evolução gradual em direção a uma precisão mais ampla já estava em vista quando o Padrão IEEE 754 para Aritmética de Ponto Flutuante foi estruturado."

No IEEE 754-2008, o formato de base 2 de 128 bits é oficialmente referido como binary128.

Formato de ponto flutuante binário de precisão quádrupla IEEE 754: binary128 O padrão IEEE 754 especifica que um binary128 possui:

Bit de sinal: 1 bit Largura do expoente: 15 bits Precisão do significando: 113 bits (112 explicitamente armazenados)

O bit de sinal determina o sinal do número (inclusive quando este número é zero, que possui sinal). "1" representa negativo.

Isso fornece uma precisão de 33 a 36 dígitos decimais significativos. Se uma string decimal com no máximo 33 dígitos significativos for convertida para o formato de precisão quádrupla IEEE 754, resultando em um número normal, e depois convertida de volta para uma string decimal com o mesmo número de dígitos, o resultado final deve corresponder à string original. Se um número de precisão quádrupla IEEE 754 for convertido para uma string decimal com pelo menos 36 dígitos significativos e depois convertido de volta para a representação de precisão quádrupla, o resultado final deve corresponder ao número original.

O formato é escrito com um bit condutor implícito com valor 1, a menos que o expoente seja armazenado com todos os zeros (usado para codificar números subnormais e zeros). Assim, apenas 112 bits do significando aparecem no formato de memória, mas a precisão total é de 113 bits (aproximadamente 34 dígitos decimais: ) para valores normais; os subnormais têm uma degradação gradual de precisão até 1 bit para o menor valor não nulo. Os bits são dispostos como:

800px|Um bit de sinal, um expoente de 15 bits e um significando de 112 bits

Codificação do expoente O expoente de ponto flutuante binário de precisão quádrupla é codificado usando uma representação em binário deslocado (ou viés), com o deslocamento zero sendo 16383; isso também é conhecido como viés do expoente no padrão IEEE 754.

Emin = 000116 − 3FFF16 = −16382 Emax = 7FFE16 − 3FFF16 = 16383 Viés do expoente = 3FFF16 = 16383

Assim, conforme definido pela representação em binário deslocado, para obter o expoente verdadeiro, o deslocamento de 16383 precisa ser subtraído do expoente armazenado.

Os expoentes armazenados 000016 e 7FFF16 são interpretados de forma especial.

Expoente Significando zero Significando não nulo Equação 000016 0, −0 números subnormais (−1)bitdesinal × 2−16382 × 0.bitsdosignificando2 000116, ..., 7FFE16 valor normalizado (−1)bitdesinal × 2bitsdoexpoente2 − 16383 × 1.bitsdosignificando2 7FFF16 ±∞ NaN (sinalizador, não sinalizador)

O menor valor estritamente positivo (subnormal) é 2−16494 ≈ 10−4965 e tem uma precisão de apenas um bit. O menor valor normal positivo é 2−16382 ≈ e tem uma precisão de 113 bits, ou seja, ±2−16494 também. O valor máximo representável é ≈ .

Exemplos de precisão quádrupla Estes exemplos são dados na representação de bits, em hexadecimal, do valor de ponto flutuante. Isso inclui o sinal, o expoente (com viés) e o significando. 0000 0000 0000 0000 0000 0000 0000 000116 = 2−16382 × 2−112 = 2−16494 ≈ 6,4751751194380251109244389582276465525 × 10−4966 (menor número subnormal positivo)

0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112) ≈ 3,3621031431120935062626778173217519551 × 10−4932 (maior número subnormal)

0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382 ≈ 3,3621031431120935062626778173217526026 × 10−4932 (menor número normal positivo)

7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112) ≈ 1,1897314953572317650857593266280070162 × 104932 (maior número normal)

3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113 ≈ 0,9999999999999999999999999999999999037 (maior número menor que um)

3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (um)

3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112 ≈ 1,0000000000000000000000000000000001926 (menor número maior que um)

4000 0000 0000 0000 0000 0000 0000 000016 = 2 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 = infinito ffff 0000 0000 0000 0000 0000 0000 000016 = −infinito

3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 0,3333333333333333333333333333333333173 (aproximação mais próxima de 1/3)

4000 921f b544 42d1 8469 898c c517 01b816 ≈ 3,1415926535897932384626433832795027975 (aproximação mais próxima de π)

4008 74d9 9564 5aa0 0c11 d0cc 9770 5e5b16 ≈ 745,69987158227021999999999999999997147 (aproximação mais próxima do número de Watts correspondentes a 1 potência de cavalo)

Por padrão, 1/3 arredonda para baixo como na precisão dupla, devido ao número ímpar de bits no significando. Assim, os bits além do ponto de arredondamento são 0101..., o que é menor que 1/2 de uma unidade na última posição (ULP).

Aritmética dupla-dupla Uma técnica comum de software para implementar uma precisão quase quádrupla usando pares de valores de precisão dupla é algumas vezes chamada de aritmética dupla-dupla.Yozo Hida, X. Li, and D. H. Bailey, Quad-Double Arithmetic: Algorithms, Implementation, and Application, Lawrence Berkeley National Laboratory Technical Report LBNL-46996 (2000). Also Y. Hida et al., Library for double-double and quad-double arithmetic (2007).J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates, Discrete & Computational Geometry 18: 305–363, 1997. Usando pares de valores de precisão dupla IEEE com significandos de 53 bits, a aritmética dupla-dupla fornece operações em números com significandos de pelo menos (na verdade, 107 bitsRobert Munafo. F107 and F161 High-Precision Floating-Point Data Types (2011). exceto para alguns dos maiores valores, devido ao intervalo limitado do expoente), apenas ligeiramente menos precisa do que o significando de 113 bits da precisão quádrupla IEEE binary128. O intervalo de um dupla-dupla permanece essencialmente o mesmo que o do formato de precisão dupla porque o expoente ainda possui 11 bits, significativamente menor do que o expoente de 15 bits da precisão quádrupla IEEE (um intervalo de para dupla-dupla contra para binary128).

Em particular, um valor de precisão dupla-dupla/quádrupla q na técnica dupla-dupla é representado implicitamente como uma soma de dois valores de precisão dupla x e y, cada um dos quais fornece metade do significando de q. Ou seja, o par é armazenado no lugar de q, e as operações nos valores de q são transformadas em operações equivalentes (mas mais complicadas) nos valores de x e y. Assim, a aritmética nesta técnica se reduz a uma sequência de operações de precisão dupla; como a aritmética de precisão dupla é comumente implementada em hardware, a aritmética dupla-dupla é tipicamente substancialmente mais rápida do que as técnicas mais gerais de aritmética de precisão arbitrária.

Note que a aritmética dupla-dupla possui as seguintes características especiais:128-Bit Long Double Floating-Point Data Type.

À medida que a magnitude do valor diminui, a quantidade de precisão extra também diminui. Portanto, o menor número no intervalo normalizado é mais estreito do que na precisão dupla. O menor número com precisão total é , ou . Números cuja magnitude seja menor que 2−1021 não terão precisão adicional em comparação com a precisão dupla. O número real de bits de precisão pode variar. Em geral, a magnitude da parte de ordem inferior do número não é maior do que a metade de uma ULP da parte de ordem superior. Se a parte de ordem inferior for menor que a metade da ULP da parte de ordem superior, bits significativos (ou todos 0s ou todos 1s) são implícitos entre o significando dos números de ordem superior e inferior. Certos algoritmos que dependem de ter um número fixo de bits no significando podem falhar ao usar números long double de 128 bits. Devido ao motivo acima, é possível representar valores como , que é o menor número representável maior que 1.

Além da aritmética dupla-dupla, também é possível gerar aritmética tripla-dupla ou quádrupla-dupla se for necessária uma precisão maior sem qualquer biblioteca de ponto flutuante de precisão superior. Eles são representados como uma soma de três (or quatro) valores de precisão dupla, respectivamente. Eles podem representar operações com pelo menos 159/161 e 212/215 bits, respectivamente. Uma extensão natural para um número arbitrário de termos (embora limitada pelo intervalo do expoente) é chamada de expansões de ponto flutuante.

Uma técnica semelhante pode ser usada para produzir uma aritmética dupla-quádrupla, que é representada como uma soma de dois valores de precisão quádrupla. Eles podem representar operações com pelo menos 226 (ou 227) bits.sourceware.org Re: The state of glibc libm

Implementações A precisão quádrupla é frequentemente implementada em software por uma variedade de técnicas (como a técnica dupla-dupla acima, embora essa técnica não implemente a precisão quádrupla IEEE), visto que o suporte direto por hardware para precisão quádrupla é menos comum (veja "Suporte por hardware" abaixo). Pode-se usar bibliotecas gerais de aritmética de precisão arbitrária para obter precisão quádrupla (ou superior), mas implementações especializadas de precisão quádrupla podem alcançar um desempenho superior.

Suporte a linguagens de programação Uma questão separada é a extensão em que os tipos de precisão quádrupla são diretamente incorporados nas linguagens de programação de computadores.

A precisão quádrupla é especificada em Fortran pelo real(real128) (o módulo iso_fortran_env do Fortran 2008 deve ser usado, a constante real128 é igual a 16 na maioria dos processadores), ou como real(selected_real_kind(33, 4931)), ou de uma forma não padronizada como REAL*16. (O REAL*16 de precisão quádrupla é suportado pelo Intel Fortran Compiler e pelo compilador GNU Fortran nas arquiteturas x86, x86-64 e Itanium, por exemplo.)

Para a linguagem de programação C, a ISO/IEC TS 18661-3 (extensões de ponto flutuante para C, tipos de intercâmbio e estendidos) especifica o _Float128 como o tipo que implementa o formato de precisão quádrupla IEEE 754 (binary128). Alternativamente, em C/C++ com alguns sistemas e compiladores, a precisão quádrupla pode ser especificada pelo tipo long double, mas isso não é exigido pela linguagem (que exige apenas que o long double seja pelo menos tão preciso quanto o double), nem é comum.

A partir do C++23, a linguagem C++ define um cabeçalho <stdfloat> que contém tipos de ponto flutuante de largura fixa. As implementações destes são opcionais, mas se suportadas, std::float128_t corresponde à precisão quádrupla.