Double-precision floating-point format
Double-precision binary floating-point is a commonly used format on PCs, due to its wider range over single-precision floating point, in despite of its performance and bandwidth cost. É comumente conhecido simplesmente como duplo. O padrão IEEE 754 especifica um binary64 como:
- bit de Sinal: 1 bit
- Expoente: 11 bits
- Significand precisão: 53 bits (52 explicitamente armazenados)
O bit de sinal determina o sinal do número (incluindo quando esse número for zero, que é assinada).
O campo do expoente é um número inteiro sem sinal de 11 bits de 0 a 2047, de forma enviesada: um valor exponencial de 1023 representa o zero real. Expoentes variam de -1022 a + 1023 porque expoentes de -1023 (todos os 0s) e +1024 (todos os 1s) estão reservados para números especiais.
a precisão significativa de 53 bits dá de 15 a 17 dígitos decimais significativos de precisão (2-53 ≈ 1.11 × 10-16). Se uma string decimal com no máximo 15 dígitos significativos é convertida para a representação de precisão dupla IEEE 754, e então 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 IEEE 754 de precisão dupla é convertido para uma cadeia decimal com pelo menos 17 dígitos significativos, e então convertido de volta para uma representação de precisão dupla, o resultado final deve corresponder ao número original.
O formato é escrito com o significado com um bit inteiro implícito do valor 1 (exceto para dados especiais, veja a codificação do expoente abaixo). Com os 52 bits da fração (F) significando aparecendo no formato de memória, a precisão total é portanto de 53 bits (aproximadamente 16 dígitos decimais, 53 log10(2) ≈ 15.955). Os bits são definidos do seguinte modo:
o valor real assumido por um dado datum de precisão dupla de 64 bits com um determinado expoente enviesado e {\displaystyle E}
e uma fracção de 52 bits é (- 1 ) Sinal ( 1). b 51 b 50 . . . b 0) 2 × 2 e-1023 {\displaystyle (- 1)^{\text{sign}}(1.b_{51}b_{50}…b_{0})_{2} \ times 2^{e-1023}}
ou
( − 1 ) sign ( 1 + ∑ i = 1 52 b 52 − i 2 − i ) × 2 e − 1023 {\displaystyle (-1)^{\text{sinal}}\left(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\right)\times 2^{e-1023}}
Entre 252=4,503,599,627,370,496 e 253=9,007,199,254,740,992 os números representáveis são exatamente os números inteiros. Para a próxima faixa, de 253 a 254, tudo é multiplicado por 2, de modo que os números representativos são os pares, etc. Inversamente, para o intervalo anterior de 251 a 252, o espaçamento é de 0,5, etc.
O espaçamento como uma fração dos números na gama de 2n a 2n+1 é 2n−52.O erro máximo de arredondamento relativo ao arredondamento de um número para o número representativo mais próximo (a máquina epsilon) é, portanto, de 2-53.
a largura de 11 bits do expoente permite a representação de números entre 10-308 e 10308, com precisão total de 15-17 dígitos decimais. Ao comprometer a precisão, a representação subnormal permite valores ainda menores até cerca de 5 × 10-324.
exponent encodingEdit
o expoente binário de dupla precisão de ponto flutuante é codificado usando uma representação offset-binária, com o deslocamento zero sendo 1023; também conhecido como viés exponente no padrão IEEE 754. Exemplos de tais representações seriam:
e =000000000012 00116 =1: |
2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}} | (smallest exponent for normal numbers) | |
e =011111111112 3ff16 =1023: |
2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}} | (zero offset) | |
e =100000001012 40516 =1029: |
2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}} | ||
e =111111111102 7fe16 =2046: |
2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}} | (highest exponent) |
The exponents 00016
and 7ff16
have a special meaning:
-
000000000002
00016
is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); e -
111111111112
7ff16
é usado para representar ∞ (se F = 0) e NaNs (se F ≠ 0),
onde F é a parte fracionária do significand. Todos os padrões de bits são codificação válida.
exceto para as exceções acima, todo o número de precisão dupla é descrito por:
( − 1 ) sinal × 2 e − 1023 × 1. fraction {\displaystyle (- 1)^{\text{sign}}\vezes 2^{e-1023}\vezes 1.{\text{fraction}}}
No caso de subnormais (e = 0) o número de precisão dupla é descrito por:
(- 1 ) sinal × 2 1 − 1023 × 0. fraction = (−1 ) sign × 2-1022 × 0. fraction {\displaystyle (- 1)^{\text{sign}}\vezes 2^{1-1023}\vezes 0.{\text{fraction}}=(- 1)^{\text{sign}}\vezes 2^{-1022}\vezes 0.{\text{fraction}}}
EndiannessEdit
de precisão Dupla examplesEdit
0 01111111111 00000000000000000000000000000000000000000000000000002
≙ 3FF0 0000 0000 000016 ≙ +20 × 1 = 1
0 01111111111 00000000000000000000000000000000000000000000000000012
≙ 3FF0 0000 0000 000116 ≙ +20 × (1 + 2-52) ≈ 1.0000000000000002, the smallest number > 1
0 01111111111 00000000000000000000000000000000000000000000000000102
≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004
0 10000000000 00000000000000000000000000000000000000000000000000002
≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2
1 10000000000 00000000000000000000000000000000000000000000000000002
≙ C000 0000 0000 000016 ≙ −21 × 1 = −2
0 10000000000 10000000000000000000000000000000000000000000000000002
≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3
0 10000000001 00000000000000000000000000000000000000000000000000002
≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4
0 10000000001 01000000000000000000000000000000000000000000000000002
≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5
0 10000000001 10000000000000000000000000000000000000000000000000002
≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6
0 10000000011 01110000000000000000000000000000000000000000000000002
≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23
0 01111111000 10000000000000000000000000000000000000000000000000002
≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)
0 00000000000 00000000000000000000000000000000000000000000000000012
≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074
≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)
0 00000000000 11111111111111111111111111111111111111111111111111112
≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52)
≈ 2.2250738585072009 × 10−308 (Max. subnormal double)
0 00000000001 00000000000000000000000000000000000000000000000000002
≙ 0010 0000 0000 000016 ≙ +2−1022 × 1
≈ 2.2250738585072014 × 10−308 (Min. normal positive double)
0 11111111110 11111111111111111111111111111111111111111111111111112
≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52))
≈ 1.7976931348623157 × 10308 (Max. Double)
0 00000000000 00000000000000000000000000000000000000000000000000002
≙ 0000 0000 0000 000016 ≙ +0
1 00000000000 00000000000000000000000000000000000000000000000000002
≙ 8000 0000 0000 000016 ≙ −0
0 11111111111 00000000000000000000000000000000000000000000000000002
≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)
1 11111111111 00000000000000000000000000000000000000000000000000002
≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)
0 11111111111 00000000000000000000000000000000000000000000000000012
≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)
0 11111111111 10000000000000000000000000000000000000000000000000012
≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)
0 11111111111 11111111111111111111111111111111111111111111111111112
≙ 7FFF FFFF FFFF FFFF16 ≙ NaN (uma alternativa de codificação de NaN)
0 01111111101 01010101010101010101010101010101010101010101010101012
= 3FD5 5555 5555 555516 ≙ +2-2 × (1 + 2-2 + 2-4 + … + 2-52) ≈ 1/3
0 10000000000 10010010000111111011010101000100010000101101000110002
= 4009 21FB 5444 2D1816 ≈ pi
Codificações de qNaN e sNaN não são completamente especificados em IEEE 754 e dependem do processador. A maioria dos processadores, como a família x86 e a família ARM processadores, usam o bit mais significativo do campo significand para indicar uma NaN tranquila; isto é o que é recomendado pelo IEEE 754. Os processadores PA-RISC usam o bit para indicar uma sinalização NaN.
Por padrão, 1/3 rounds down, instead of up like single precision, because of the odd number of bits in the significand.
In more detail:
Given the hexadecimal representation 3FD5 5555 5555 555516, Sign = 0 Exponent = 3FD16 = 1021 Exponent Bias = 1023 (constant value; see above) Fraction = 5 5555 5555 555516 Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here = 2−2 × (15 5555 5555 555516 × 2−52) = 2−54 × 15 5555 5555 555516 = 0.333333333333333314829616256247390992939472198486328125 ≈ 1/3
Execution speed with double-precision arithmeticEdit
Using double-precision floating-point variables and mathematical functions (e.g., sin, cos, atan2, log, exp and sqrt) are slower than working with their single precision counterparts. Uma área de computação onde esta é uma questão particular é o código paralelo rodando em GPUs. Por exemplo, ao usar a plataforma CUDA da NVIDIA, os cálculos com precisão dupla tomam, dependendo de um hardware, aproximadamente 2 a 32 vezes o tempo de completar em comparação com aqueles feitos usando precisão única.
de Precisão limitações inteiro valuesEdit
- números Inteiros a partir de -253 253 (-9007199254740992 para 9007199254740992) pode ser representado exatamente
- números Inteiros entre 253 e 254 = 18014398509481984 rodada para um múltiplo de 2 (mesmo número)
- números Inteiros entre 254 e 255 = 36028797018963968 rodada para um múltiplo de 4