(Concluir) Iniciação ler IEEE Floating-Point erros

Traduções de Artigos Traduções de Artigos
Artigo: 42980 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Matemática de vírgula flutuante é um tópico complexo que confuses Muitos programadores. Iniciação abaixo deverão ajudá-lo reconhecer programação situações onde é provável que ocorrem erros de vírgula flutuante e como evitar esses. Deve também permitem-lhe reconhecer casos são causados por limitações inerentes matemático de vírgula flutuante por oposição a erros de compilador real.

Mais Informação

Decimal binário número de sistemas e

Normalmente, é contar elementos em base 10. A base é completamente arbitrária. O único motivo que pessoas utilizaram tradicionalmente base 10 é que têm 10 dedos, que efectuou úteis ferramentas de contagens.

O número 532.25 em decimal (base 10) significa o seguinte:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

No sistema de número binário (base 2), cada coluna representa uma potência de 2 em vez de 10. Por exemplo, o número 101.01 significa o seguinte:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Como números inteiros estão representados no PC

Porque não existe nenhuma parte fraccional para um número inteiro, respectiva representação do computador é muito mais simples do que para valores de vírgula flutuante. Números inteiros normais em computadores pessoais (PCs) são 2 bytes (16 bits) tempo com o bit mais significativo indicando o sinal. Números inteiros longos são 4 bytes. Valores positivos são simples números binários. Por exemplo:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

No entanto, números inteiros negativos são representados utilizando das duas esquema complemento. Para obter das duas complemento representação para um número negativo, efectuar representação binária para absoluto valor o número e inverter todos os bits e adicione 1. Por exemplo:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Tenha em atenção que-1 decimal = 1111 1111 1111 1111 em binário, que explica porque Basic trata-1 como true lógico (todos os bits = 1). Esta é uma consequência da não ter operadores separados para comparações lógicas e ao nível do bit. Muitas vezes no Basic, é conveniente utilizar o fragmento de código abaixo quando o programa a efectuar comparações lógicas muitos. Isto ajuda significativamente legibilidade.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Note que adicionar qualquer combinação do dois complementar números em conjunto utilizando normal aritmética binária produz o resultado correcto.

Problemas no que respeita à floating-Point

Cada número inteiro decimal pode ser exactamente representado por um número inteiro binário; no entanto, isto não é verdadeiro para números com fracções. De facto, cada número irrational em base 10 também estará irrational em qualquer sistema com uma base mais pequeno do que 10.

Para binário, em particular, apenas fraccionais números que podem ser representados no formulário p/q, q sendo uma potência de número inteiro de 2, podem ser expressa exactamente, com um número finito de bits.

Fracções decimais mesmo comuns, tais como decimal 0,0001, não pode ser representadas exactamente em binário. (0,0001 é uma fracção binária repetição com um período de 104 bits!)

Isto explica o motivo pelo qual um exemplo simples, tais como os seguintes
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

irá PRINT 1.000054 como saída. O pequeno erro no representando 0,0001 em binário é propagado para a soma.

Pela mesma razão, deverá sempre ser bastante cuidadoso ao efectuar comparações nos números de real. O exemplo seguinte ilustra um erro de programação comum:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

Isto não irá PRINT "Igualdade!" porque 69.82 não podem ser representadas exactamente em binário, que faz com que o valor que resulta da atribuição ser LIGEIRAMENTE diferente (em binário) que o valor é gerado a partir da expressão. Na prática, deve sempre de código tais comparações de tal forma, para permitir alguns tolerância. Por exemplo:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Isto irá PRINT "Igual".

IEEE Formatar números

QuickBasic para MS-DOS, versão 3.0 foi enviada com uma versão MBF (Microsoft binário flutuantes pontos) e uma versão de IEEE (Institute of Electrical and Electronics Engineers) para computadores com um coprocessador matemático. QuickBasic para MS-DOS, versões 4.0 e posteriores só utilizam IEEE. Microsoft escolheu a norma IEEE para representar valores vírgula flutuante de versões actuais do Basic pelas seguintes razões principais três:
  1. Para permitir Basic para utilizar os Intel matemático coprocessors, que formato utilizar IEEE. Coprocessors a série de 80 x 87 Intel não consegue trabalhar com números de formato binário do Microsoft.
  2. Para tornar interlanguage chamar entre Basic, C, Pascal, FORTRAN e MASM muito mais fácil. Caso contrário, rotinas de conversão teria de ser utilizado para enviar valores numéricos de um idioma para outro.
  3. Para obter consistência. O IEEE é o aceite padrão da indústria para compiladores C e FORTRAN.
Segue-se uma comparação de IEEE e MBF representações para um número de precisão dupla rápida:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Para obter mais informações sobre as diferenças entre IEEE e MBF, representação vírgula flutuante, de consulta de base de dados de conhecimento do Microsoft as seguintes palavras:
   IEEE and floating and point and appnote
				

Note que o IEEE tem mais bits dedicados à expoente, o que permite representar um intervalo maior de valores. MBF tem mais bits mantissa, que permite que seja mais precisos respectivo intervalo mais estreita.

Conceitos de Floating-Point gerais

É muito importante que compreenda que qualquer sistema de vírgula flutuante binário pode representar apenas um número finito de vírgula flutuante valores no formato exacto. Todos os outros valores tem de ser aproximados pelo valor representáveis mais próximo. A norma IEEE especifica o método de arredondamento de valores para o valor representáveis "mais próximo". QuickBasic para MS-DOS suporta o padrão e arredonda acordo com para as regras de IEEE.

Além disso, tenha em atenção que os números que podem ser representados em IEEE são repartidos muito grande intervalo. Pode imagine uma linha de número. Existe uma alta densidade dos números representáveis perto 1.0 e-1.0 mas menos e menos que vá para 0 ou infinito.

O objectivo da norma IEEE, que foi concebido para cálculos de engenharia é maximizar a precisão (para obter fechar possíveis para a número). Precisão refere-se ao número de dígitos que pode representar. O IEEE padrão tenta equilibrar o número de bits dedicadas para o expoente com o número de bits utilizado para a parte fraccional do número, para manter a exactidão e precisão dentro de limites aceitáveis.

Detalhes de IEEE

Números de vírgula flutuante são representados no seguinte formato, onde [expoente] é o expoente binário:
   X =  Fraction * 2^(exponent - bias)
				

[Fracção] é a parte fraccional normalizada do número, normalizada porque o expoente é ajustado para que o bit à esquerda é sempre um 1. Desta forma, não é necessário ser armazenadas e obter um pouco mais de precisão. É por isso não existe um bit implícito. Pode considerar este como notação científica, onde manipular o expoente tenham um dígito à esquerda da vírgula decimal, excepto no binário, sempre possível manipular o expoente para que o primeiro bit seja um 1, uma vez que existem apenas 1s e 0s.

[compensação] é o valor de compensação utilizado para evitar ter de armazenar expoentes negativos.

A compensação para números de precisão simples é 127 e 1023 (decimal) para números de precisão dupla.

Os valores iguais para todos os zeros e todos os 1 (binário) são reservados para representando casos especiais. Existem alguns outros casos especiais, que indicam a várias condições de erro.

Exemplos de precisão simples

2 = 1 * 2 ^ 1 = 0100 0000 0000 a 0000... 0000 0000 = 4000 0000 hex
Nota o bit de sinal é zero e o expoente armazenado é 0 0000 128 ou 100 em binário, que é 127 mais 1. A mantissa armazenada é (1). 000 0000... 0000 0000 tem um espaçamento implícito 1 e binário apontar, por isso a mantissa real é 1.

Entre -2 =-1 * 2 ^ 1 = 1100 0000 0000 a 0000... 0000 0000 = C000 0000 hex
Mesmo que + 2, excepto que o bit de início de sessão é definido. Isto acontece para IEEE de todas as formatar números de vírgula flutuante.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex
Mesmo mantissa, expoente aumenta em um (valor polarizado é 129 ou 100 1 0000 em binário.

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Expoente mesmo, mantissa é maior por meio--é 100 (1)... 0000 0000 0000, que, uma vez que esta é uma fracção binária, 1-1/2 (os valores de dígitos fraccionais são 1/2, 1/4, 1/8, etc..).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Expoente mesmo como outros poderes de 2, mantissa é um inferior a 2 em 127 ou 011 1111 1 em binário.

0,75 = 1.5 * 2 ^-1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
O expoente polarizado é 126, 011 1111 binário em 0 e a mantissa é 100 (1)... 0000 0000 0000, 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex
Exactamente o mesmo 2 excepto que o bit que representa 1/4 é definido na mantissa.

1.6 = 0,1 * 2 ^ Desde -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 seja uma fracção repetição em binário. É apenas shy de 1.6 a mantissa e o expoente polarizado indica que 1.6 deve ser dividida por 16 (é 011 1101 1 em binário, 123 em decimal). O expoente VERDADEIRO é 127 123 = - 4, o que significa que o factor pelo qual multiplicar é 2 ** desde -4 = 1/16. Note que o último bit é arredondada a mantissa armazenada. Esta é uma tentativa para representar o número unrepresentable com precisão possível. (O motivo que 1/10 e 1/100 são não exactamente representáveis em binário é semelhante da forma que é não exactamente representáveis no formato decimal 1/3.)

0 = 1.0 * 2 ^-128 = zeros--um caso especial.

Outros erros Floating-Point comuns

Seguem-se erros de vírgula flutuante comuns:
  1. Arredondar erro

    Este erro ocorre quando todos os bits num número binário não não possível utilizar um cálculo.

    Exemplo: Adicionar 0,0001 para 0.9900 (precisão simples)

    Decimal 0,0001 vai ser representada como:
    10100011011011100010111 (1) * 2^(-14+Bias) (13 com 0s em binário)!
    0.9900 vai ser representada como:
    11111010111000010100011 (1) * 2^(-1+Bias)
    Agora para adicionar, na realidade, estes números, os pontos decimais (binários) devem ser alinhados. Para este têm de ser Unnormalized. Segue-se a adição resultante:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    isto é denominado um erro arredondar porque alguns computadores arredondar quando deslocar para adição. Outros simplesmente truncagem. Arredondar - desactivar erros são importantes a considerar sempre que estiver a adicionar ou multiplicar dois valores muito diferentes.
  2. Subtrair dois quase igual valores
           .1235
          -.1234
           _____
           .0001
    
    						
    esta irá ser normalizada. Note que apesar dos números de originais cada tinham quatro algarismos, o resultado tem apenas um dígito significativo.
  3. Área de excesso e capacidade insuficiente

    Isto ocorre quando o resultado é demasiado grande ou demasiado pequeno para ser representado pelo tipo de dados.
  4. Erro quantizing

    Isto acontece com os números que não podem ser representados no formato exacto pelo padrão de vírgula flutuante.
  5. Divisão por um número muito pequeno

    Isto pode accionar um erro de "dividir por zero" ou pode produzir resultados incorrectos, como no seguinte exemplo:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    QuickBasic In para MS-DOS X agora tem o valor 888887, em vez da resposta correcta, 900000.
  6. Erro de saída

    Este tipo de erro ocorre quando as funções de saída alterar os valores que estão a funcionar.

Propriedades

Artigo: 42980 - Última revisão: 16 de agosto de 2005 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 para MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • Microsoft Cinemania 97 Standard Edition
Palavras-chave: 
kbmt KB42980 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 42980
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com