Artigo: 69333 - Última revisão: terça-feira, 16 de Agosto de 2005 - Revisão: 2.2

Como contornar problemas de precisão/comparação Floating-Point

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

Para testar fiável se duas variáveis de vírgula flutuante ou expressões são iguais (utilizando o formato de IEEE ou MBF), terá de subtrair as duas variáveis comparadas e testar se os respectivos diferença é menor do que um valor seleccionado nos limites de significância de precisão simples ou duplo. NENHUM OUTRO TESTE DE IGUALDADE IRÁ SER FIÁVEL. As seguintes fórmulas eficazmente teste se X e Y são iguais:

  1. Para precisão único, tem de testar se a diferença entre X e Y é menor do que os algarismos do valor 7 inferiores 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 precisão dupla, tem de testar se a diferença entre X e Y é menor do que os algarismos do valor 15 inferiores a 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 vírgula flutuante IEEE encontra nas Standard e Professional as versões do Microsoft Visual Basic for MS-DOS, versão 1.0; no Microsoft QuickBasic para MS-DOS (apenas QB87.EXE coprocessador versão), versões 3.0, 4.0, 4.0b e 4.5; no compilador base do Microsoft para MS-DOS e MS OS/2, versões 6.0 e 6.0b; e no Microsoft Basic Professional Development sistema (PDS) para MS-DOS e MS OS/2, versões 7.0 e 7.1.

MBF (formato binário do Microsoft) encontra-se no Microsoft QuickBasic para MS-DOS (apenas QB.EXE coprocessador não versão), versões 1.0, 1.01, 2.0, 2.01 e 3.0 e no Microsoft GW-BASIC Interpreter para MS-DOS, versões 3.2, 3.22 e 3.23.

As informações contidas neste artigo também estão incluídas no ficheiro de ajuda fornecido com o padrão e Professional as versões do Microsoft Visual Basic for MS-DOS, versão 1.0.

Mais Informação

NOTA: algarismos num número calculado podem ser perdidas devido ao seguinte: vários cálculos, especialmente a adição de números muito separadamente no valor ou subtracção de números semelhantes no valor. Quando um número resultados de cálculos múltiplos, poderá ser necessário alterar o teste de igualdade utilize menos dígitos significativos para reflectir a matemática perda de algarismos significativos. Se o teste de significância utiliza demasiados dígitos significativos, poderá conseguir descobrir se os números comparados de igualdade estão realmente iguais dentro do limite de precisão possível.

Numa base produtos listados acima que utilizar o formato de vírgula flutuante IEEE, cálculos intermédios são efectuados num registo de temporário interno 64 bits, que tem mais bits de precisão que são armazenados em variáveis de precisão simples ou dupla precisão. Muitas vezes, resulta numa instrução IF devolver um erro que indica que o cálculo intermédio não é igual à expressão comparadas. Por exemplo:
   X = 25
   Y = 60.1
   IF 1502.5 = (X * Y) THEN PRINT "equal"
				
executar o código acima não imprimem "igual". Por outro lado, o seguinte método a utilizar uma variável do marcador de posição será impresso "igual", mas ainda não é uma técnica fiável como um teste de igualdade:
   Z = 25 * 60.1
   IF 1502.5 = Z THEN PRINT "equal"
				
Nota explícito tipo numérico casts (! para precisão simples, # para dupla precisão) irão afectar a precisão que são armazenados e impresso cálculos. O tipo de directores efectuar, pode ainda ver resultados inesperados arredondamentos:
   PRINT 69.82! + 1    ' Single precision, prints 70.82.
   PRINT 69.82# + 1    ' Double precision, prints 70.81999999999999.
				
para uma representação numérica exacta decimal (base 10), como, por exemplo, para cálculos de dólares e cêntimos, deverá utilizar CURRENCY (tipo de dados encontrado no Visual Basic for MS-DOS, versão 1.0 e básica PDS para MS-DOS, versões 7.0 e 7.1 @). O tipo de dados CURRENCY exactamente armazena até 19 dígitos com 4 dígitos após a casa decimal.

Referência:

Normas IEEE e no MBF tentam equilibrar a 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 na mantissa, que determina o número de casas decimais podem ser representadas.

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

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

Precisão único IEEE tem 24 bits de mantissa e dupla precisão tem bits 53 do mantissa. No entanto, todos os precisão simples e dupla precisão 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 base para MS-DOS, versões 6.0 e 6.0b; e PDS base para o MS-DOS, versões 7.0 e 7.1re efectuados num registo 64-bit temporário para maior precisão. Como resultado, IEEE cálculos são mais precisos do que os cálculos de MBF, apesar capacidade do MBF para representar mais bits de precisão dupla.

A maior parte dos números na notação decimal (base 10) não têm uma representação exacta no formato de armazenamento de vírgula flutuante binário (base 2) utilizado em tipos de dados de precisão simples e dupla precisão. Tanto o formato de IEEE MBF não é possível representar exactamente (e deve arredondar) todos os números que não estão de 1.x o formulário à potência de y (onde x e y são números base 2). Os números que podem ser representados exactamente são propagar-se através de uma enorme variedade. Uma alta densidade dos números representáveis estiver perto 1.0 e-1.0, mas menos e menos representáveis números ocorrem como os números de ir na direcção de 0 ou infinito.

As limitações acima fazer Basic para devolver resultados de vírgula flutuante diferente do que seria de esperar. É possível encontrar na base de dados de conhecimento da Microsoft consultando as seguintes palavras mais informações sobre este tópico:
Floating ponto e formato e QuickBasic
O formato de ponto flutuante do IEEE está documentado na manuais seguintes:

  1. Páginas de 16-21 de "Microsoft QuickBasic 4.0: Basic Language Reference" para QuickBasic para MS-DOS, versões 4.0 e 4.0b. Tenha em atenção que os 4.0 manuais necessitam de uma correcção na página 19 para exemplo de código MHex $, tal como explicado num artigo separado encontrado na base de dados de conhecimento da Microsoft através de consultar as seguintes palavras:
    MHex $ E 19
  2. Páginas 12-17, do "Microsoft QuickBasic 4.5: Basic Language Reference" para QuickBasic para MS-DOS, versão 4.5. Tenha em atenção que este manual opcional tem de ser encomendado separadamente utilizando um cartão de ordem fornecido com a versão 4.5.
  3. Páginas 702-705 do "Microsoft Basic 7.0: Programmer ' s Guide" para Microsoft base PDS para MS-DOS, versões 7.0 e 7.1.
O formato de ponto flutuante MBF é documentado num artigo separado que pode ser encontrado na base de dados de conhecimento da Microsoft consultando as seguintes palavras:
MBF e conversão e expoente

A informação contida neste artigo aplica-se a:
  • 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 BASIC Professional Development System 7.1
  • Microsoft GW-BASIC 3.2
  • Microsoft GW-BASIC 3.22
  • Microsoft GW-BASIC 3.23
Palavras-chave: 
kbmt kbhowto KB69333 KbMtpt
Tradução automáticaTraduçã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: 69333  (http://support.microsoft.com/kb/69333/en-us/ )
Retired KB ArticleExclusã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.