Pergunta

Eu sei um pouco sobre como números de ponto flutuante são representados, mas não o suficiente, eu tenho medo.

A pergunta geral é:

Para uma determinada precisão (para meus propósitos, o número de casas decimais precisas em base 10), o intervalo de números pode ser representado por 16, 32 e 64-bit IEEE-754 sistemas?

Especificamente, eu só estou interessado no intervalo de números de 16 bits e 32 bits precisas para +/- 0.5 (o lugar mais) ou +/- 0,0005 (o lugar milésimos).

Foi útil?

Solução

Para um dado IEEE 754-número ponto flutuante X , se

2^E <= abs(X) < 2^(E+1)

, em seguida, a distância a partir X para o próximo maior número de ponto flutuante representável ( epsilon ) é:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

As equações acima nos permitem calcular o seguinte:

  • Para metade precisão ...

    Se você quiser uma precisão de +/- 0,5 (ou 2 ^ -1), o tamanho máximo que o número pode ser é 2 ^ 10. Qualquer maior do que isto e a distância entre os números de ponto flutuante é maior do que 0,5.

    Se você quiser uma precisão de +/- 0,0005 (cerca de 2 ^ -11), o tamanho máximo que o número pode ser é 1. Qualquer maior do que isso e a distância entre os números de ponto flutuante é maior do que 0,0005.

  • Para precisão simples ...

    Se você quiser uma precisão de +/- 0,5 (ou 2 ^ -1), o tamanho máximo que o número pode ser é 2 ^ 23. Qualquer maior do que isto e a distância entre os números de ponto flutuante é maior do que 0,5.

    Se você quiser uma precisão de +/- 0,0005 (cerca de 2 ^ -11), o tamanho máximo que o número pode ser é 2 ^ 13. Qualquer maior do que isto e a distância entre os números de ponto flutuante é maior do que 0,0005.

  • Para precisão dupla ...

    Se você quiser uma precisão de +/- 0,5 (ou 2 ^ -1), o tamanho máximo que o número pode ser é 2 ^ 52. Qualquer maior do que isto e a distância entre os números de ponto flutuante é maior do que 0,5.

    Se você quiser uma precisão de +/- 0,0005 (cerca de 2 ^ -11), o tamanho máximo que o número pode ser é 2 ^ 42. Qualquer maior do que isto e a distância entre os números de ponto flutuante é maior do que 0,0005.

Outras dicas

Para inteiros de ponto flutuante (eu vou dar a minha resposta em termos de IEEE de precisão dupla), cada número inteiro entre 1 e 2 ^ 53 é exatamente representável. Além de 2 ^ 53, inteiros que são exatamente representável são espaçadas, aumentando potências de dois. Por exemplo:

  • Cada segundo inteiro entre 2 ^ 53 + 2 e 2 ^ 54 pode ser representado exatamente.
  • Cada 4ª inteiro entre 2 ^ 54 + 4 e 2 ^ 55 pode ser representado exatamente.
  • Cada 8ª inteiro entre 2 ^ 55 + 8 e 2 ^ 56 pode ser representado exatamente.
  • Cada número inteiro entre 2 16 ^ 56 + 16 e 2 ^ 57 pode ser representado exactamente.
  • Cada inteiro 32ª entre 2 ^ 57 + 32 e 2 ^ 58 pode ser representado exatamente.
  • Cada número inteiro 64 entre 2 ^ 58 + 64 e 2 ^ 59 pode ser representado exatamente.
  • Cada número inteiro entre 2 128 ^ 59 + 128 e 2 ^ 60 pode ser representado exactamente.
  • Cada inteiro 256 entre 2 ^ 60 + 256 e 2 ^ 61 pode ser representado exatamente.
  • Cada inteiro 512th entre 2 ^ 61 + 512 e 2 ^ 62 pode ser representado exatamente. . . .

Os inteiros que não são exatamente representável são arredondados para o número inteiro representável mais próximo, de modo que o pior arredondamento caso é 1/2 o espaçamento entre inteiros representáveis.

link de A precisão formulário citou Peter R ao ref MSDN é provavelmente uma boa regra, mas é claro que a realidade é mais complicada.

O fato de que o "ponto" em "ponto flutuante" é uma binário ponto e não ponto decimal tem uma maneira de derrotar nossas intuições. O exemplo clássico é 0,1, que precisa de uma precisão de apenas um dígito em decimal, mas não é representável exatamente em binário em tudo.

Se você tiver um fim de semana para matar, ter um olhar para O que cada Scientist Computer deve saber sobre Floating-Point Arithmetic . Você provavelmente vai estar particularmente interessado nas seções sobre Precision binário para Decimal Conversão .

Em primeiro lugar, nem IEEE-754-2008 nem -1985 têm carros alegóricos de 16 bits; mas é uma adição proposto com um expoente 5-bit e fraco de 10 bits. IEE-754 usa um bit de sinal dedicado, assim que a escala positiva e negativa é a mesma. Além disso, a fração tem um implícita 1 na frente, de modo a obter um bit extra.

Se você quiser precisão ao lugar mais, como em você pode representar cada inteiro, a resposta é bastante simples: As mudanças expoente o ponto decimal para o fim direito da fração. Assim, uma fração de 10 bits faz com que você ± 2 11 .

Se você quiser um pouco depois do ponto decimal, você dá-se um pouco antes, então você tem ± 2 10 .

Single precisão tem uma fração de 23 bits, então você teria que ± 2 24 inteiros.

Quantos bits de precisão que você precisa depois do ponto decimal depende inteiramente os cálculos que você está fazendo, e quantos você está fazendo.

  • 2 10 = 1.024
  • 2 11 = 2,048
  • 2 23 = 8388608
  • 2 24 = 16777216
  • 2 53 = 9,007,199,254,740,992 (precisão dupla)
  • 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (quad-precisão)

Veja também

IEEE 754-1985 :

v = (-1) ^ ^ (expoente de exponent_bias) sinal * s * (1 + fracção)

Nota (1 + fracção). Como @bendin salientar, usando ponto flutuante binário, você não pode expressar decimal simples valores, tais como de 0,1. A implicação é que você pode introduzir erros de arredondamento, fazendo adições simples muitas e muitas vezes ou chamar as coisas como truncamento. Se você estiver interessado em qualquer tipo de precisão que seja, a única maneira de conseguir isso é usar um decimal de ponto fixo, que basicamente é um inteiro escalado.

Se eu entendi sua pergunta, isso depende do seu idioma.
Para C #, consulte a do MSDN ref . Float tem uma precisão de 7 dígitos e precisão dupla 15-16 dígitos.

Levei muito tempo para descobrir que quando se usa duplos em Java, eu não estava perdendo precisão significativa nos cálculos. ponto flutuante realmente tem uma capacidade muito boa para representar números de precisão bastante razoável. A precisão que estava perdendo era imediatamente após a conversão de decimal números digitados pelos usuários para o binário representação ponto que é suportado nativamente flutuante. Eu comecei recentemente a conversão de todos os meus números para BigDecimal. BigDecimal é muito mais trabalho para lidar com o código de flutuadores ou duplas, uma vez que não é um dos tipos primitivos. Mas, por outro lado, eu vou ser capaz de representar exatamente os números que os usuários digitar.

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