Como contornar problemas ponto flutuante de precisão/comparação

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 69333
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sumário
Para testar confiável se duas variáveis de ponto flutuante de dupla ou expressões são iguais (usando o formato IEEE ou MBF), você deve subtrair as duas variáveis que estão sendo comparadas e testar se a diferença é menor do que um valor escolhido em limites de significância para precisão simples ou dupla. NENHUM OUTRO TESTE PARA IGUALDADE SERÁ CONFIÁVEL. As fórmulas a seguir teste confiável se X e Y são iguais:

  1. Para obter precisão única, você deve testar se a diferença de X e Y é menor do que os dígitos significativos de valor 7 menores que X ou Y. Dividir X ou Y por 10 ^ 7 para localizar o valor de comparação. Por exemplo:
          ' To try this example in VBDOS.EXE:      ' 1. From the File menu, choose New Project.      ' 2. Copy the code example to the Code window.      ' 3. Press F5 to run the program.      IF ABS(X! - Y!) <= (X! / 10^7) THEN         PRINT "Equal within 7 digits"      ENDIF						
  2. Para obter precisão dupla, você deve testar se a diferença de X e Y é menor do que os dígitos significativos de valor 15 menores que X ou Y. Dividir X ou Y por 10 ^ 15 para localizar o valor de comparação. Por exemplo:
          ' To try this example in VBDOS.EXE:      ' 1. From the File menu, choose New Project.      ' 2. Copy the code example to the Code window.      ' 3. Press F5 to run the program.      IF ABS(X# - Y#) <= (X# / 10^15) THEN         PRINT "Equal within 15 digits"      ENDIF						
O formato de ponto flutuante do IEEE é encontrado no Standard e Professional Editions do Microsoft Visual Basic para MS-DOS, versão 1.0; no Microsoft QuickBasic para MS-DOS (versão co-processador QB87.EXE somente), versões 3.0, 4.0, 4.0b e 4.5; no Microsoft Basic Compiler para MS-DOS e MS OS/2, versões 6.0 e 6.0b; e no Microsoft Basic Professional desenvolvimento sistema (PDS) para MS-DOS e MS OS/2, versões 7.0 e 7.1.

MBF (Microsoft formato binário) é encontrado no Microsoft QuickBasic para MS-DOS (versão não co-processador QB.EXE somente), versões 1.0, 1.01, 2.0, 2.01 e 3.0 e no intérprete de GW-Basic da Microsoft para MS-DOS, versões 3.2, 3.22 e 3.23.

As informações neste artigo também estão incluídas no arquivo de Ajuda fornecido com o padrão e Professional Editions do Microsoft Visual Basic para MS-DOS, versão 1.0.
Mais Informações
Observação: os dígitos significativos em um número calculado podem ser perdidos devido ao seguinte: vários cálculos, especialmente a adição de números afastados no valor ou subtração de números semelhantes em valor. Quando um número resulta de vários cálculos, talvez seja necessário alterar seu teste para igualdade use menos dígitos significativos para refletir a perda de matemática de dígitos significativos. Se o teste de significância usa muitos dígitos significativos, você pode falhar ao descobrir que números em comparação comparados igualdade são realmente iguais dentro do limite de precisão de possível.

No Basic produtos listados acima que usam o formato de ponto flutuante do IEEE, cálculos intermediários são executados em um registro de temporário interno 64-bit, tem mais bits de precisão que são armazenados em variáveis de precisão única ou dupla precisão. Isso geralmente resulta em uma instrução IF retornando um erro que afirma que o cálculo intermediário não é igual a expressão que estão sendo comparado. Por exemplo:
   X = 25   Y = 60.1   IF 1502.5 = (X * Y) THEN PRINT "equal"				
executar o código acima não imprimirá "igual". Por outro lado, o método seguinte usando uma variável de espaço reservado será impresso "igual", mas ainda não é uma técnica confiável como um teste de igualdade:
   Z = 25 * 60.1   IF 1502.5 = Z THEN PRINT "equal"				
Observe que converte tipo numérico explícito (! para precisão única, # para precisão dupla) afetará a precisão no qual os cálculos são armazenados e impresso. Qualquer tipo de transmissão você realizar, você poderá ainda ver resultados inesperados arredondamento:
   PRINT 69.82! + 1    ' Single precision, prints 70.82.   PRINT 69.82# + 1    ' Double precision, prints 70.81999999999999.				
para uma representação numérica exata decimal (base 10), como para cálculos de dólares e centavos, você deve usar CURRENCY (tipo de dados no Visual Basic for MS-DOS, versão 1.0 e Basic PDS para MS-DOS, versões 7.0 e 7.1 @). O tipo de dados CURRENCY exatamente armazena até 19 dígitos, com 4 dígitos após a casa decimal.

Referência:

Padrões do IEEE e MBF tentam equilibrar precisão e a precisão com intervalo numérico e velocidade. Precisão mede quantos bits significativos de precisão não são perdidos em cálculos. Precisão refere-se ao número de bits de mantissa, que determina quantos dígitos decimais podem ser representados.

O formato IEEE e MBF armazenam números do formulário 1.x à potência de y (onde x e y são números de base 2; x é o mantissa e y é o expoente).

Precisão única MBF tem 24 bits de mantissa, e precisão dupla tem 56 bits de mantissa. Todos os cálculos de MBF são executados dentro de apenas 24 ou 56 bits.

Precisão única IEEE tem 24 bits de mantissa, e precisão dupla tem bits 53 de mantissa. No entanto, todos os precisão simples e precisão dupla IEEE cálculos no Visual Basic for MS-DOS, versão 1.0; QuickBasic para MS-DOS, versões 3.0/4.x; no compilador básica para MS-DOS, versões 6.0 e 6.0b; e PDS básica para MS-DOS, versões 7.0 e 7.1re executados em um registro temporário de 64 bits para maior precisão. Como resultado, os cálculos de IEEE são mais precisos do que MBF cálculos, apesar capacidade do MBF para representar mais bits de precisão dupla.

A maioria dos números em notação decimal (base 10) não são necessário uma representação exata no formato de armazenamento de ponto flutuante binário (base 2) usado em tipos de dados de precisão simples e precisão dupla. O formato IEEE MBF não é possível representar exatamente (e deve arredondar) todos os números não são do 1.x formulário à potência de y (onde x e y são números de base 2). Os números que podem ser representados exatamente estão espalhados em um intervalo muito grande. Uma alta densidade de números representáveis é próximo 1.0 e-1.0, mas menos e menos representáveis números ocorrerem como os números de ir para 0 ou infinito.

As limitações acima com freqüência causar Basic retornar resultados de ponto flutuante diferente, você poderia esperar. Obter mais informações sobre esse tópico podem ser encontradas na Base de dados de Conhecimento da Microsoft consultando as seguintes palavras:
Floating e ponto e formato e QuickBasic
O formato de ponto flutuante do IEEE está documentado nos seguintes manuais:

  1. Páginas de 16-21 de "QuickBasic 4.0: básica referência da linguagem Microsoft" para QuickBasic para MS-DOS, versões 4.0 e 4.0b. Observe que os 4.0 manuais precisam uma correção na página 19 para exemplo de código $ MHex, conforme explicado em um artigo separado encontrado na Base de dados de Conhecimento por consultar as seguintes palavras:
    MHex $ E 19
  2. Páginas 12-17 de "QuickBasic 4.5: básica referência da linguagem Microsoft" para QuickBasic para MS-DOS versão 4.5. Observe que este manual opcional deve ser ordenada separadamente usando um cartão de ordem fornecido com a versão 4.5.
  3. Páginas 702-705 do "Microsoft Basic 7.0: guia do programador do" para o PDS básica de Microsoft para MS-DOS, versões 7.0 e 7.1.
O formato de ponto flutuante MBF está documentado em um artigo separado que pode ser encontrado na Base de dados de Conhecimento da Microsoft consultando as seguintes palavras:
MBF e conversão e expoente
VBmsdos QuickBas BasicCom 1,00 1.01 2,00 2.01 3.00 3.20 3.22 3.23 4.00 4.00b 4.50 6.00 6.00b 7.00 7.10

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 69333 - Última Revisão: 08/16/2005 21:27:24 - Revisão: 2.2

Microsoft Visual Basic for MS-DOS, Microsoft QuickBasic 4.0, Microsoft QuickBASIC 4.0b, Microsoft QuickBasic 4.5 for MS-DOS, Microsoft BASIC Compiler 6.0, Microsoft BASIC Compiler 6.0b, Microsoft BASIC Professional Development System 7.0, Microsoft BASIC Professional Development System 7.1, Microsoft GW-BASIC 3.2, Microsoft GW-BASIC 3.22, Microsoft GW-BASIC 3.23

  • kbmt kbhowto KB69333 KbMtpt
Comentários