Qual é a diferença entre uma operação de ponto flutuante de precisão simples e dupla?

169

Qual é a diferença entre uma operação de ponto flutuante de precisão única e operação flutuante de precisão dupla?

Estou especialmente interessado em termos práticos em relação aos consoles de videogame. Por exemplo, o Nintendo 64 tem um processador de 64 bits e, se isso acontecer, isso significaria que era capaz de operações de ponto flutuante de precisão dupla? O PS3 e o Xbox 360 podem executar operações de ponto flutuante de precisão dupla ou apenas precisão única e, em uso geral, são usados ​​os recursos de precisão dupla (se existirem?).

tweetypi
fonte
17
O fato de a CPU ter 64 bits geralmente significa que a CPU possui registradores de uso geral de 64 bits (ou seja, número inteiro) e tamanho do endereço de memória . Mas isso não diz nada sobre matemática de ponto flutuante. Por exemplo, as CPUs Intel IA-32 são de 32 bits, mas suportam nativamente flutuadores de precisão dupla.
Roman Zavalov

Respostas:

215

Nota: o Nintendo 64 possui um processador de 64 bits, no entanto:

Muitos jogos aproveitaram o modo de processamento de 32 bits do chip, pois a maior precisão de dados disponível nos tipos de dados de 64 bits não é normalmente exigida pelos jogos em 3D, além do fato de que o processamento de dados de 64 bits usa o dobro de RAM, cache e largura de banda, reduzindo assim o desempenho geral do sistema.

Da Webopedia :

O termo precisão dupla é um termo impróprio, porque a precisão não é realmente dupla.
A palavra double deriva do fato de que um número de precisão dupla usa o dobro de bits que um número de ponto flutuante regular.
Por exemplo, se um número de precisão única exigir 32 bits, sua contraparte de precisão dupla terá 64 bits.

Os bits extras aumentam não apenas a precisão, mas também a gama de magnitudes que podem ser representadas.
A quantidade exata pela qual a precisão e a amplitude de magnitudes são aumentadas depende de qual formato o programa está usando para representar valores de ponto flutuante.
A maioria dos computadores usa um formato padrão conhecido como formato de ponto flutuante IEEE.

O formato de precisão dupla IEEE, na verdade, tem mais do que o dobro de bits de precisão que o formato de precisão única, além de uma faixa muito maior.

Do padrão IEEE para aritmética de ponto flutuante

Precisão única

A representação padrão de ponto flutuante de precisão única IEEE requer uma palavra de 32 bits, que pode ser representada como numerada de 0 a 31, da esquerda para a direita.

  • O primeiro bit é o bit de sinal , S,
  • os próximos oito bits são os bits do expoente , 'E' e
  • os 23 bits finais são a fração 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

O valor V representado pela palavra pode ser determinado da seguinte forma:

  • Se E = 255 e F for diferente de zero, V = NaN ("Não é um número")
  • Se E = 255 e F for zero e S for 1, V = -Infinito
  • Se E = 255 e F for zero e S for 0, V = Infinito
  • Se 0<E<255então, em V=(-1)**S * 2 ** (E-127) * (1.F)que "1.F" pretende representar o número binário criado prefixando F com um líder implícito 1 e um ponto binário.
  • Se E = 0 e F for diferente de zero, então V=(-1)**S * 2 ** (-126) * (0.F). Esses são valores "não normalizados".
  • Se E = 0 e F for zero e S for 1, então V = -0
  • Se E = 0 e F for zero e S for 0, V = 0

Em particular,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Dupla precisão

A representação padrão de ponto flutuante de precisão dupla IEEE requer uma palavra de 64 bits, que pode ser representada como numerada de 0 a 63, da esquerda para a direita.

  • O primeiro bit é o bit de sinal , S,
  • os próximos onze bits são os expoentes , 'E' e
  • os 52 bits finais são a fração 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

O valor V representado pela palavra pode ser determinado da seguinte forma:

  • Se E = 2047 e F for diferente de zero, V = NaN ("Não é um número")
  • Se E = 2047 e F for zero e S for 1, V = -Infinito
  • Se E = 2047 e F for zero e S for 0, V = Infinito
  • Se 0<E<2047então, em V=(-1)**S * 2 ** (E-1023) * (1.F)que "1.F" pretende representar o número binário criado prefixando F com um líder implícito 1 e um ponto binário.
  • Se E = 0 e F for diferente de zero, V=(-1)**S * 2 ** (-1022) * (0.F)esses são valores "não normalizados".
  • Se E = 0 e F for zero e S for 1, então V = -0
  • Se E = 0 e F for zero e S for 0, V = 0

Referência:
Padrão ANSI / IEEE 754-1985,
Padrão para aritmética de ponto flutuante binário.

VonC
fonte
9
Sei que isso é da sua fonte, mas não gosto da frase: "O termo precisão dupla é um termo impróprio porque a precisão não é realmente dupla". Single e Double precisão nos dias de hoje são muito universalmente definido pelo IEEE, e como você aponta precisão simples tem 23 bits na fração e dupla tem 52 bits - que é basicamente o dobro da precisão ...
Carl Walsh
5
@ZeroDivide ' **' é Exponenciação
VonC 28/08/13
11
! @CarlWalsh 52/23 = 2 ergo não é "duplicar a precisão"
Rfoo
@johnson Você tem mais detalhes sobre valores não normalizados em easy68k.com/paulrsm/6502/WOZFPPAK.TXT e também em stackoverflow.com/a/28801033/6309
VonC
2
@rfoo Se você quer ter certeza, não é exatamente o dobro, mas 52/2> 23, então sim, é o dobro da precisão, é apenas o dobro e mais um pouco.
perfil completo de JShorthouse
42

Li muitas respostas, mas nenhuma parece explicar corretamente de onde vem a palavra duplo . Lembro-me de uma explicação muito boa dada por um professor universitário que tive alguns anos atrás.

Recordando o estilo da resposta do VonC, uma única representação de ponto flutuante de precisão usa uma palavra de 32 bits.

  • 1 bit para o sinal , S
  • 8 bits para o expoente , 'E'
  • 24 bits para a fração , também chamada de mantissa , ou coeficiente (mesmo que apenas 23 estejam representados). Vamos chamá-lo de 'M' (para mantissa , prefiro esse nome porque "fração" pode ser mal interpretada).

Representação:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Apenas para salientar, o bit de sinal é o último, não o primeiro.)

Uma representação de ponto flutuante de precisão dupla usa uma palavra de 64 bits.

  • 1 bit para o sinal , S
  • 11 bits para o expoente , 'E'
  • 53 bits para a fração / mantissa / coeficiente (mesmo que apenas 52 estejam representados), 'M'

Representação:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Como você pode notar, escrevi que a mantissa possui, em ambos os tipos, um pouco mais de informação em comparação com sua representação. De fato, a mantissa é um número representado sem todo o seu não significativo 0. Por exemplo,

  • 0.000124 torna-se 0.124 × 10 −3
  • 237.141 torna-se 0.237141 × 10 3

Isso significa que a mantissa sempre estará na forma

0.α 1 α 2 ... α t × β p

onde β é a base da representação. Mas uma vez que a fracção é um número binário, ácido a 1 irá sempre ser igual a 1, assim, a fracção pode ser reescrita como 1.α 2 α 3 ... α t + 1 × 2 p e o inicial 1 pode ser assumido implicitamente, abrindo espaço para um bit extra (α t + 1 ).

Agora, é obviamente verdade que o dobro de 32 é 64, mas não é daí que a palavra vem.

A precisão indica o número de dígitos decimais que estão corretos , ou seja, sem qualquer tipo de erro de representação ou aproximação. Em outras palavras, indica quantos dígitos decimais podem ser usados com segurança .

Com isso dito, é fácil estimar o número de dígitos decimais que podem ser usados ​​com segurança:

  • precisão única : log 10 (2 24 ), que tem cerca de 7 ~ 8 dígitos decimais
  • precisão dupla : log 10 (2 53 ), com cerca de 15 ~ 16 dígitos decimais
Alessandro
fonte
19

Ok, a diferença básica na máquina é que a precisão dupla usa duas vezes mais bits que um único. Na implementação usual, são 32 bits para um único e 64 bits para o dobro.

Mas o que isso significa ? Se assumirmos o padrão IEEE, um único número de precisão terá cerca de 23 bits da mantissa e um expoente máximo de cerca de 38; uma precisão dupla tem 52 bits para a mantissa e um expoente máximo de cerca de 308.

Os detalhes estão na Wikipedia , como sempre.

Charlie Martin
fonte
11

Para adicionar a todas as respostas maravilhosas aqui

Antes de mais, float e double são usados ​​para representação de números números fracionários. Portanto, a diferença entre os dois decorre do fato de com que precisão eles podem armazenar os números.

Por exemplo: eu tenho que armazenar 123.456789 Um pode ser capaz de armazenar apenas 123.4567 enquanto outro pode ser capaz de armazenar exatamente 123.456789.

Então, basicamente, queremos saber com que precisão o número pode ser armazenado e é o que chamamos de precisão.

Citando @Alessandro aqui

A precisão indica o número de dígitos decimais que estão corretos , ou seja, sem qualquer tipo de erro de representação ou aproximação. Em outras palavras, indica quantos dígitos decimais podem ser usados com segurança .

O flutuador pode armazenar com precisão de 7 a 8 dígitos na parte fracionária, enquanto o Double pode armazenar com precisão de 15 a 16 dígitos na parte fracionária

Assim, o flutuador pode armazenar o dobro da quantidade de peça fracionária. É por isso que Double é chamado de double the float

Cara simples
fonte
7

Quanto à pergunta "O ps3 e o xbxo 360 podem executar operações de ponto flutuante de precisão dupla ou apenas precisão única e em uso generoso são os recursos de precisão dupla usados ​​(se existirem?)".

Eu acredito que ambas as plataformas são incapazes de ponto flutuante duplo. O processador Cell original tinha apenas flutuadores de 32 bits, o mesmo com o hardware da ATI no qual o XBox 360 se baseia (R600). O Cell recebeu suporte de ponto flutuante duplo mais tarde, mas tenho certeza de que o PS3 não usa esse brilho.

codekaizen
fonte
5

Basicamente, a aritmética de ponto flutuante de precisão simples lida com números de ponto flutuante de 32 bits, enquanto a precisão dupla lida com 64 bits.

O número de bits em precisão dupla aumenta o valor máximo que pode ser armazenado, além de aumentar a precisão (ou seja, o número de dígitos significativos).

cleto
fonte
5

Todos explicaram em grande detalhe e nada que eu possa acrescentar mais. Embora eu queira explicá-lo nos Termos de Layman ou em inglês simples

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

Uma variável capaz de armazenar ou representar "1,9" fornece menos precisão do que aquela capaz de armazenar ou representar 1,9999. Essas frações podem representar uma enorme diferença em grandes cálculos.

Asad
fonte
2

Dupla precisão significa que os números levam o dobro do comprimento da palavra para armazenar. Em um processador de 32 bits, as palavras são de 32 bits; portanto, o dobro é de 64 bits. O que isso significa em termos de desempenho é que as operações em números de precisão dupla demoram um pouco mais para serem executadas. Portanto, você obtém um alcance melhor, mas há um pequeno impacto no desempenho. Esse impacto é mitigado um pouco pelas unidades de ponto flutuante do hardware, mas ainda está lá.

O N64 usou um NEC VR4300 baseado em MIPS R4300i, que é um processador de 64 bits, mas o processador se comunica com o restante do sistema através de um barramento de 32 bits. Portanto, a maioria dos desenvolvedores usava números de 32 bits por serem mais rápidos, e a maioria dos jogos na época não precisava de precisão adicional (então eles usavam flutuadores e não duplos).

Todos os três sistemas podem executar operações flutuantes de precisão única e dupla, mas podem não ser por causa do desempenho. (embora praticamente tudo depois do n64 tenha usado um barramento de 32 bits, então ...)

Alex
fonte
1

Antes de mais, float e double são usados ​​para representação de números números fracionários. Portanto, a diferença entre os dois decorre do fato de com que precisão eles podem armazenar os números.

Por exemplo: eu tenho que armazenar 123.456789 Um pode ser capaz de armazenar apenas 123.4567 enquanto outro pode ser capaz de armazenar exatamente 123.456789.

Então, basicamente, queremos saber com que precisão o número pode ser armazenado e é o que chamamos de precisão.

Citando @Alessandro aqui

A precisão indica o número de dígitos decimais que estão corretos, ou seja, sem qualquer tipo de erro de representação ou aproximação. Em outras palavras, indica quantos dígitos decimais podem ser usados ​​com segurança.

O flutuador pode armazenar com precisão de 7 a 8 dígitos na parte fracionária, enquanto o Double pode armazenar com precisão de 15 a 16 dígitos na parte fracionária

Portanto, o dobro pode armazenar o dobro da quantidade de parte fracionária e do flutuador. É por isso que Double é chamado de double the float

djbtalk
fonte
0

De acordo com a IEEE754 • Padrão para armazenamento de ponto flutuante • Padrões de 32 e 64 bits (precisão única e precisão dupla) • Expoente de 8 e 11 bits, respectivamente • Formatos estendidos (mantissa e expoente) para resultados intermediários

Abdullah Al Mamun
fonte
-3

O número de precisão único usa 32 bits, com o MSB sendo bit de sinal, enquanto o número de precisão dupla usa 64 bits, o MSB sendo o bit de sinal

Única precisão

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Dupla precisão:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Steve Bennett
fonte