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

StackOverflow https://stackoverflow.com/questions/801117

Pergunta

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

Estou especialmente interessado em termos práticos em relação às consolas de jogos de vídeo. Por exemplo, se a Nintendo 64 tem um processador de 64 bits e se isso acontecer, então isso significaria que era capaz de precisão dupla de operações de ponto flutuante? Pode a atração PS3 e Xbox 360 off de precisão dupla de operações de ponto ou única precisão simples e de uso geral flutuante é a capacidade de precisão dupla fez uso de (se é que existe?).

Foi útil?

Solução

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

Muitos jogos aproveitou modo de processamento de 32 bits do chip como a maior precisão dados disponíveis com os tipos de dados de 64 bits não é tipicamente exigidos por jogos 3D, bem como o fato de que o processamento utiliza dados de 64 bits duas vezes mais RAM, cache, e largura de banda, reduzindo assim o desempenho geral do sistema.

A partir Webopedia :

A precisão dupla prazo é algo de um equívoco, porque a precisão não é realmente duplo.
A palavra deriva duplas do fato de que um número de precisão dupla usos dobro de bits como um número normal de ponto flutuante.
Por exemplo, se um número de precisão simples requer 32 bits, o seu homólogo de precisão dupla será 64 bits de comprimento.

Os bits extras aumentar não só a precisão, mas também a gama de magnitudes que podem ser representados.
O valor exato pelo qual a precisão e gama de magnitudes são aumentados depende do que formatar o programa está usando para representar valores de ponto flutuante.
A maioria dos computadores usam um formato padrão conhecido como o formato IEEE de ponto flutuante.

A partir da IEEE padrão para aritmética de ponto

Single Precision

O IEEE precisão simples de ponto flutuante representação padrão requer uma palavra de 32 bits, o que pode ser representado como numeradas de 0 a 31, esquerda para a direita.

  • O primeiro bit é o sinal bit, S,
  • os próximos oito bits são o expoente pedaços, 'E' e
  • os últimos 23 bits são o fracção 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

O valor V representada pela palavra pode ser determinada como se segue:

  • Se E = 255 e M é diferente de zero, então V = NaN ( "Não é um número")
  • Se E = 255 e F é zero e s é 1, então V = -Infinity
  • Se E = 255 e F é zero e s é 0, então V = Infinito
  • Se 0<E<255 então V=(-1)**S * 2 ** (E-127) * (1.F) onde "1.F" é a intenção de representar o número binário criado por prefixo F com um implícita levando 1 e um ponto de binário.
  • Se E = 0 e F é diferente de zero, então V=(-1)**S * 2 ** (-126) * (0.F). Estes são valores "não normalizadas".
  • Se E = 0 e M é zero e s é 1, então V = -0
  • Se E = 0 e M é zero e s é 0, então 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)

precisão dupla

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

  • O primeiro bit é o sinal bit, S,
  • os próximos onze bits são o expoente pedaços, 'E' e
  • os últimos 52 bits são o fracção 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

O valor V representada pela palavra pode ser determinada como se segue:

  • Se E = 2047 e M é diferente de zero, então V = NaN ( "Não é um número")
  • Se E = 2047 e M é zero e s é 1, então V = -Infinity
  • Se E = 2047 e M é zero e s é 0, então V = Infinito
  • Se 0<E<2047 então V=(-1)**S * 2 ** (E-1023) * (1.F) onde "1.F" é a intenção de representar o número binário criado por prefixo F com um implícita levando 1 e um ponto de binário.
  • Se E = 0 e F é diferente de zero, então V=(-1)**S * 2 ** (-1022) * (0.F) Estes são valores "não normalizadas".
  • Se E = 0 e M é zero e s é 1, então V = -0
  • Se E = 0 e M é zero e s é 0, então V = 0

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

Outras dicas

Eu li um monte de respostas, mas nenhuma parece explicar correctamente onde a palavra duplo vem. Lembro-me de uma boa explicação dada por um professor da Universidade de eu tinha há alguns anos.

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

  • 1 bit para o sinal , S
  • 8 bits para o expoente , 'E'
  • 24 bits para o fração , também chamado mantissa ou coeficiente (embora apenas 23 estão representados). Vamos chamá-lo de 'M' (para mantissa , eu prefiro este nome como "fração" pode ser mal entendido).

Representação:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

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

A duplo flutuante de precisão representação de ponto usa uma palavra de 64 bits.

  • 1 bit para o sinal , S
  • 11 bits para o expoente , 'E'
  • 53 bits para o fracção / mantissa / coeficiente (apesar de apenas 52 estão representadas), 'H'

Representação:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Como você pode notar, eu escrevi que o mantissa , em ambos os tipos, um pouco mais de informação em relação a sua representação. Na verdade, a mantissa é um número representado sem toda a sua 0 não-significativa. Por exemplo,

  • 0.000124 se torna 0,124 × 10 -3
  • 237,141 torna-se 0,237141 × 10 3

Isto significa que o mantissa será sempre na forma

0.a 1 a 2 ... a t × ß p

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

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

O precisão indica o número de casas decimais que são correta , ou seja, sem qualquer tipo de erro representação ou aproximação. Em outras palavras, ele indica quantos dígitos decimais um pode segurança uso.

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

  • precisão simples : log 10 (2 24 ), que é de cerca de 7 ~ 8 dígitos decimais
  • precisão dupla : log 10 (2 53 ), que é de cerca de 15 ~ 16 dígitos decimais

Ok, a diferença básica na máquina é que precisão dupla usa o dobro de bits como único. Na implementação de costume, que é de 32 bits para individuais, 64 bits para o dobro.

Mas o que isso significa ? Se assumirmos o padrão IEEE, em seguida, um único número de precisão tem 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 são em Wikipedia , como de costume.

Para adicionar todas as respostas maravilhosas aqui

Antes de tudo flutuador e duplo são utilizados tanto para a representação de números números fracionários. Assim, a diferença entre os dois vem do fato com a quantidade de precisão que pode armazenar os números.

Por exemplo: eu tenho que armazenar 123.456789 Um pode ser capaz de armazenar apenas 123.4567, enquanto outros podem ser capazes de armazenar a exata 123.456789

.

Então, basicamente, queremos saber o quanto precisão possível o número ser armazenado e é o que chamamos de precisão.

Citando @Alessandro aqui

A precisão indica o número de casas decimais que são correta , isto é, sem qualquer tipo de erro de representação ou de aproximação. No outras palavras, ele indica quantos dígitos decimais um pode segurança uso.

Float pode armazenar com precisão cerca de 7-8 dígitos na parte fracionária enquanto Duplo pode armazenar com precisão cerca de 15-16 dígitos na parte fracionária

Assim, flutuador pode armazenar dobrar a quantidade de parte fracionária. É por isso duas vezes é chamado o dobro do flutuador

Como para a pergunta "Pode o ps3 e xbxo 360 retirar operações de ponto flutuante de precisão dupla ou única precisão simples e em uso generel é a capacidade de precisão dupla fez uso de (se é que existe?)."

Eu acredito que ambas as plataformas são incapazes de ponto flutuante double. O processador celular original só tinha 32 flutuadores bit, mesmo com o hardware que o ATI XBox 360 baseia-se na (R600). O celular tem duplo suporte de ponto flutuante mais tarde, mas eu tenho certeza que o PS3 não usar esse chippery.

precisão simples ponto trata aritméticas flutuante com números de ponto flutuante de 32 bits enquanto precisão dupla lida com 64 bits.

O número de bits de precisão dupla aumenta o valor máximo que pode ser armazenado, assim como o aumento da precisão (isto é, o número de algarismos significativos).

precisão dobro significa que os números leva duas vezes a palavra-length para armazenar. Em um processador de 32 bits, as palavras são todos os 32 bits, então duplos são 64 bits. O que isto significa em termos de desempenho é que as operações em números de precisão dupla demorar um pouco mais para executar. De modo a obter uma melhor gama, mas há um pequeno hit no desempenho. Este sucesso é atenuado um pouco a unidades de ponto de hardware flutuante, mas ainda existe.

O N64 utilizado um NEC VR4300 baseado no R4300i MIPS que é um processador de 64 bits, e <> / nos comunica processador com o resto do sistema ao longo de um bus de 32 bits de largura. Assim, a maioria dos desenvolvedores usado 32 números de bits, porque eles são mais rápidos, e a maioria dos jogos no momento não precisa a precisão adicional (por isso eles usaram carros alegóricos não funciona).

Todos os três sistemas pode fazer precisão simples e dupla operações flutuante, mas não pode por causa do desempenho. (Embora praticamente tudo após o n64 usado um barramento de 32 bits assim ...)

De acordo com o IEEE754 • padrão para armazenamento de ponto flutuante • 32 e 64 padrões de bits (precisão simples e dupla precisão) • 8 e 11 bit expoente respectivamente • formatos estendidos (tanto mantissa e expoente) para os resultados intermediários

Antes de tudo float e double são utilizados tanto para a representação de números números fracionários. Assim, a diferença entre os dois vem do fato com a quantidade de precisão que pode armazenar os números.

Por exemplo: eu tenho que armazenar 123.456789 Um pode ser capaz de armazenar apenas 123.4567, enquanto outros podem ser capazes de armazenar a exata 123.456789

.

Então, basicamente, queremos saber o quanto precisão possível o número ser armazenado e é o que chamamos de precisão.

Citando @Alessandro aqui

A precisão indica o número de casas decimais que são corretas, ou seja, sem qualquer tipo de erro representação ou aproximação. Em outras palavras, ele indica quantos dígitos decimais pode-se usar com segurança.

Float pode armazenar com precisão cerca de 7-8 dígitos na parte fracionária enquanto dupla podem armazenar com precisão cerca de 15-16 dígitos na parte fracionária

Assim, dupla pode armazenar o dobro da quantidade de parte fracionária como de float. É por isso duas vezes é chamado o dobro do flutuador

número de precisão única usa 32 bits, com a estar pouco sinal MSB, enquanto duplo números precisão usos 64bits, MSB bit sendo sinal

precisão Single

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

precisão Duplo:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top