As operações aritméticas de vírgula flutuante podem originar resultados incorrectos no Excel

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

Nesta página

Sumário

Este artigo descreve como o Microsoft Excel armazena e calcula números de vírgula flutuante. Isto poderá afectar o resultado de alguns números ou fórmulas devido ao arredondamento e/ou truncagem de dados.

Descrição Geral

O Microsoft Excel foi concebido com base na especificação IEEE 754 relativa ao armazenamento e cálculo de números de vírgula flutuante. O IEEE é o Institute of Electrical and Electronics Engineers, uma entidade internacional que, entre outras coisas, determina as normas de software e hardware informático. A especificação 754 é uma especificação largamente adoptada que descreve o modo como os números de vírgula flutuante devem ser armazenados num computador binário. A sua popularidade deve-se ao facto de permitir que os números de vírgula flutuante sejam armazenados numa quantidade razoável de espaço e que os cálculos sejam efectuados de um modo relativamente rápido. A norma 754 é utilizada nas unidades de vírgula flutuante e nos processadores de dados numéricos de praticamente todos os microprocessadores dos computadores actuais que implementam operações matemáticas de vírgula flutuante, incluindo os processadores Intel, Motorola, Sun e MIPS.

Quando os números são armazenados, um número binário correspondente pode representar qualquer número inteiro ou fraccional. Por exemplo, a fracção 1/10 pode ser representada num sistema numérico decimal como 0,1. No entanto, o mesmo número em formato binário transforma-se no decimal binário repetitivo
0001100110011100110011 (e assim sucessivamente)
e pode ser repetido infinitamente. Este número não pode ser representado numa quantidade de espaço finita (limitada). Consequentemente, este número é arredondado por defeito, aproximadamente -2,8E-17, quando é armazenado.

No entanto, a especificação IEEE 754 tem algumas limitações, que podem ser enquadradas em três categorias gerais:
  • limitações de máximo/mínimo
  • precisão
  • números binários repetitivos

Mais Informação

Limitações de Máximo/Mínimo

Todos os computadores têm um número máximo e um número mínimo que podem ser processados. Uma vez que o número de bits de memória onde o número está armazenado é finito, o número máximo ou mínimo que pode ser armazenado também é finito. Para o Excel, o número máximo que pode ser armazenado é 1,79769313486232E+308 e o número mínimo positivo que pode ser armazenado é 2,2250738585072E-308.

Casos em Que a Norma IEEE 754 foi Respeitada

  • Insuficiência: A insuficiência ocorre quando é gerado um número demasiado pequeno para ser representado. No IEEE e no Excel, o resultado é 0 (com a excepção de que o IEEE tem um conceito de -0 e o Excel não).
  • Excesso: O excesso ocorre quando é gerado um número demasiado grande para ser representado. O Excel utiliza uma representação especial própria para este caso (#NUM!).

Casos em Que a Norma IEEE 754 Não foi Respeitada

  • Números não normalizados: Um número não normalizado é indicado por um expoente de 0. Nesse caso, o número inteiro é armazenado na mantissa, sendo que esta não tem um 1 à esquerda implícito. Isto origina uma perda de precisão e, quanto mais pequeno for o número, mais precisão se perde. Os números na extremidade menor deste intervalo só têm um dígito de precisão.
    Exemplo: Um número normalizado tem um 1 à esquerda implícito. Por exemplo, se a mantissa representa 0011001, o número normalizado transforma-se em 10011001 devido ao 1 à esquerda implícito. Um número não normalizado não tem um 1 à esquerda implícito, pelo que, no nosso exemplo de 0011001, o número não normalizado permanece igual. Neste caso, o número normalizado tem oito dígitos significativos (10011001), enquanto que o número não normalizado tem cinco dígitos significativos (11001), visto que os zeros à esquerda são insignificantes.

    Basicamente, os números não normalizados são uma solução para permitir o armazenamento de números menores do que o limite inferior normal. A Microsoft não implementa esta parte opcional da especificação porque os números não normalizados, devido à respectiva natureza, têm um número variável de dígitos significativos. Este facto poderá permitir a entrada de um erro significativo nos cálculos.
  • Infinitos Positivos/Negativos: Os infinitos são gerados por uma divisão por 0. O Excel não suporta infinitos, apresentando um erro #DIV/0! nestes casos.
  • NaN (Não Numérico): NaN é utilizado para representar operações inválidas (tais como infinito/infinito, infinito-infinito ou a raiz quadrada de -1). Os NaNs permitem que um programa continue após uma operação inválida. Em vez disso, o Excel gera imediatamente um erro, tal como #NUM! ou #DIV/0!.

Precisão

Em binário, um número de vírgula flutuante é armazenado em três partes, dentro de um intervalo de 65 bits: o sinal, o expoente e a mantissa.
Reduzir esta tabelaExpandir esta tabela
Sinal de 1 BitExpoente de 11 Bits1 Bit ImplícitoMantissa de 52 Bits
O sinal armazena o sinal do número (positivo ou negativo), o expoente armazena a potência de 2 ao qual o número é elevado ou reduzido (a potência máxima/mínima de 2 é +1,023 e -1,022) e a mantissa armazena o número propriamente dito. A área de armazenamento finita para a mantissa limita a proximidade de dois números de vírgula flutuante adjacentes (ou seja, a precisão).

A mantissa e o expoente são armazenados como componentes separados. Consequentemente, a precisão possível poderá variar, dependendo do tamanho do número (a mantissa) que está a ser manipulado. No caso do Excel, apesar deste poder armazenar números entre 1,79769313486232E308 e 2,2250738585072E-308, só o poderá fazer dentro de 15 dígitos de precisão. Esta limitação é um resultado directo da conformidade com a especificação IEEE 754 e não é uma limitação do Excel. Este nível de precisão também é encontrado noutros programas de folha de cálculo.

Os números de vírgula flutuante são representados no formato seguinte, em que expoente é o expoente binário:
X = Fracção * 2^(expoente - compensação)
Fracção é a parte fraccional normalizada do número, isto porque o expoente é ajustado de modo a que o bit à esquerda seja sempre um 1. Deste modo, o bit não tem de ser armazenado, permitindo obter mais um bit de precisão. É por este motivo que existe um bit implícito. Isto é semelhante à notação científica, onde o expoente é manipulado de modo a ter um dígito à esquerda da casa decimal; à excepção do binário, é sempre possível manipular o expoente de modo a que o primeiro bit seja um 1, porque só existem 1s e 0s.

A compensação é o valor de compensação utilizado para evitar ser necessário armazenar expoentes negativos. A compensação para números de precisão simples é 127 e para números de precisão dupla é 1,023 (decimal). O Excel armazena números utilizando a precisão dupla.

Exemplo Utilizando Números Muito Grandes

Introduza os seguintes dados num livro novo:
   A1: 1,2E+200
   B1: 1E+100
   C1: =A1+B1
O valor resultante na célula C1 seria 1,2E+200, o mesmo valor da célula A1. Na realidade, se comparar as células A1 e C1 utilizando a função SE, por exemplo SE(A1=C1), o resultado será VERDADEIRO. Isto é causado pelo facto da especificação IEEE só armazenar 15 dígitos significativos de precisão. Para poder armazenar o cálculo acima, o Excel iria necessitar de, pelo menos, 100 dígitos de precisão.

Exemplo Utilizando Números Muito Pequenos

Introduza os seguintes dados num livro novo:
   A1: 0,000123456789012345
   B1: 1
   C1: =A1+B1 O valor resultante na célula C1 seria 1,00012345678901 em vez de 1,000123456789012345. Isto é causado pelo facto da especificação IEEE só armazenar 15 dígitos significativos de precisão. Para poder armazenar o cálculo acima, o Excel iria necessitar de, pelo menos, 19 dígitos de precisão. <Formatting Type="H3">Corrigir Erros de Precisão</Formatting> O Excel oferece dois métodos básicos para compensar erros de arredondamento: a função ARRED e a opção de livro <UITerm>Precisão como apresentado</UITerm> ou <UITerm>Definir precisão como apresentada</UITerm>. Método 1: A função ARRED</Formatting> O exemplo seguinte, com os dados indicados acima, utiliza a função ARRED para forçar um número para cinco dígitos. Isto permite-lhe comparar o resultado com outro valor com êxito. <Formatting Type="FixedText"><![CDATA[
   A1: 1,2E+200
   B1: 1E+100
   C1: =ARRED(A1+B1,5)
tem como resultado 1,2E+200.
   D1: =SE(C1=1,2E+200, VERDADEIRO, FALSO)
tem como resultado o valor VERDADEIRO.

Método 2: Precisão como Apresentado

Em alguns casos, poderá conseguir impedir que os erros de arredondamento afectem o seu trabalho utilizando a opção Precisão como apresentado. Esta opção força que o valor de cada número existente na folha de cálculo seja o valor apresentado. Para activar esta opção, siga estes passos:
  1. No Excel 2003 e em versões anteriores, clique em Opções no menu Ferramentas.
  2. No separador Cálculo, clique para seleccionar a caixa de verificação Precisão como apresentado.
  1. No Excel 2007, clique no Botão do Microsoft Office, clique em Opções do Excel e, em seguida, clique na categoria Avançadas.
  2. Na secção Ao calcular este livro, seleccione o livro que pretende e, em seguida, seleccione a caixa de verificação Definir precisão como apresentada.
Por exemplo, se seleccionar um formato de número que mostre duas casas decimais e activar a opção Precisão como apresentado, toda a precisão que ultrapasse as duas casas decimais será perdida quando guardar o livro. Esta opção afecta o livro activo, incluindo todas as folhas de cálculo. Não é possível anular esta opção e recuperar os dados perdidos. Recomendamos que guarde o livro antes de activar esta opção.

Números Binários Repetitivos e Cálculos com Resultados Perto de Zero

Outro problema confuso associado ao armazenamento de números de vírgula flutuante em binário é que alguns números, que são números finitos não repetitivos em base 10 decimal, são números infinitos repetitivos em binário. O exemplo mais comum deste problema é o valor 0,1 e as respectivas variantes. Apesar destes números poderem ser representados perfeitamente em base 10, o mesmo número em formato binário transforma-se no número binário repetitivo seguinte quando armazenado na mantissa:
000110011001100110011 (e assim sucessivamente)
A especificação IEEE 754 não possui disposições especiais para nenhum número; armazena o que consegue na mantissa e trunca o resto. Isto origina um erro de aproximadamente -2,8E-17, ou 0,000000000000000028, quando o número é armazenado.

Até mesmo fracções decimais comuns, tal como o número decimal 0,0001, não podem ser representadas com exactidão em binário. (0,0001 é uma fracção binária repetitiva com um período de 104 bits). Isto é semelhante ao motivo pelo qual a fracção 1/3 não pode ser representada com exactidão em decimal (0,33333333333333333333 repetitivo).

Isto explica o motivo pelo qual um exemplo simples em Microsoft Visual Basic for Applications
   Sub Main()
      MySum = 0
      For I% = 1 To 10000
         MySum = MySum + 0,0001
      Next I%
      Debug.Print MySum
   End Sub
irá efectuar o PRINT de 0,999999999999996 como resultado. O pequeno erro da representação de 0,0001 em binário é propagado para a soma.

Exemplo de Adicionar um Número Negativo

  1. Introduza o seguinte num livro novo: A1: =(43.1-43.2)+1
  2. Clique com o botão direito do rato na célula A1 e clique em Formatar Células. No separador Número, clique em Científico em Categoria. Defina as Casas decimais para 15.
Em vez de apresentar 0,9, o Excel apresenta 0,899999999999999. Uma vez que (43,1-43,2) é calculado em primeiro lugar, -0,1 é armazenado temporariamente e o erro originado pelo armazenamento de -0,1 é introduzido no cálculo.

Exemplo de Quando um Valor Alcança Zero

  1. No Excel 95 ou anterior, introduza o seguinte num livro novo: A1: =1.333+1.225-1.333-1.225
  2. Clique com o botão direito do rato na célula A1 e clique em Formatar Células. No separador Número, clique em Científico em Categoria. Defina as Casas decimais para 15.
Em vez de apresentar 0, o Excel 95 apresenta -2,22044604925031E-16.

No entanto, o Excel 97 introduziu uma optimização que tenta corrigir este problema. Se uma operação de adição ou subtracção resultar num valor igual ou próximo de zero, o Excel 97 e as versões posteriores irão compensar qualquer erro introduzido como consequência da conversão de um operando de e para binário. O exemplo acima, quando efectuado no Excel 97 e versões posteriores, apresenta correctamente 0 ou 0,000000000000000E+00 em notação científica. Para obter mais informações, clique nos números de artigo que se seguem para visualizar os artigos na Base de Dados de Conhecimento Microsoft:
172911 Incorrect result raising 10 to very large/very small power
214373 Incorrect result raising 10 to very large/very small power
Para obter mais informações sobre números de vírgula flutuante e a especificação IEEE 754, consulte os seguintes Web sites:
http://www.ieee.org

http://stevehollasch.com/cgindex/coding/ieeefloat.html

Referências

Para obter mais informações sobre como contornar estes erros, clique no número de artigo que se segue para visualizar o artigo na Base de Dados de Conhecimento Microsoft:
214118 How to correct rounding errors in floating-point arithmetic

Propriedades

Artigo: 78113 - Última revisão: 18 de setembro de 2011 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft Excel 2010
  • Microsoft Office Excel 2008 for Mac
  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Excel 2004 for Mac
  • Microsoft Excel X para Macintosh
  • Microsoft Excel 2001 para Macintosh
  • Microsoft Excel 98 para Macintosh
  • Microsoft Office Excel 2003
Palavras-chave: 
kbinfo KB78113

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