Articles

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:

IEEE 754 Double Floating Point Format.svg

o valor real assumido por um dado datum de precisão dupla de 64 bits com um determinado expoente enviesado e {\displaystyle E}

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

(- 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}}

(-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 =00000000001200116=1: 2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}}

{\displaystyle 2^{1-1023}=2^{-1022}}
(smallest exponent for normal numbers)
e =0111111111123ff16=1023: 2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}}

{\displaystyle 2^{1023-1023}=2^{0}}
(zero offset)
e =10000000101240516=1029: 2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}}

{\displaystyle 2^{1029-1023}=2^{6}}
e =1111111111027fe16=2046: 2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}}

{\displaystyle 2^{2046-1023}=2^{1023}}
(highest exponent)

The exponents 00016 and 7ff16 have a special meaning:

  • 00000000000200016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); e
  • 1111111111127ff16 é 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}}}

{\displaystyle (- 1)^{\text{sign}}}\times 2^{e-1023}\times 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}}}

{\displaystyle (- 1)^{\text{sign}}}\times 2^{1-1023}\times 0.{\text{fraction}}=(- 1)^{\text{sign}}\vezes 2^{-1022}\vezes 0.{\text{fração}}}

EndiannessEdit

Esta seção é um trecho de Ordenação § ponto Flutuante
Embora o onipresente processadores x86 de hoje little-endian armazenamento para todos os tipos de dados (inteiro, ponto flutuante), há um número de arquiteturas de hardware, onde os números de ponto flutuante são representados no big-endian forma, enquanto os números inteiros são representados em little-endian formulário. Há processadores ARM que têm metade pequena-endian, metade grande-endian flutuante-point representação para números de precisão dupla: ambas as palavras de 32 bits são armazenadas em registros inteiros little-endian, mas o mais significativo primeiro. Como tem havido muitos formatos de ponto flutuante sem representação padrão de” rede ” para eles, o padrão XDR usa o big-endian IEEE 754 como sua representação. Pode, portanto, parecer estranho que a norma generalizada IEEE 754 de vírgula flutuante não especifique a perigosidade. Teoricamente, isso significa que mesmo os dados padrão de ponto flutuante IEEE escritos por uma máquina podem não ser legíveis por outra. No entanto, em computadores modernos padrão (i.e., implementing IEEE 754), one may in practice safety assum that the endianness is the same for floating-point numbers as for integers, making the conversion straightless of data type. (Pequenos sistemas embutidos que utilizam formatos especiais de vírgula flutuante podem, no entanto, ser outra questão.)

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *