Responda rápido: quanto é 1 * (0,5 – 0,4 – 0,1) ?
Se você fez as contas, deve ter chegado a 0. Não é isso que o Excel pensa:

Aparentemente, o BROffice usa-se da premissa matemática e nos fornece um resultado real, o que faria o Excel fornecer uma resposta errada.
Mas como a Microsoft não pode ficar para trás, os winusers argumentam que isso ocorre devido à norma IEEE 754, que regulamenta como os programas de computador devem tratar números com ponto flutuante. O resultado seria apenas o fruto da conversão dos números da base decimal para a base binária. Há argumentos que a própria ajuda do Excel traz essa conta como exemplo para esse padrão.
Depois de 1985, todos os processadores passaram a adoptar uma convenção para a representação de números em vírgula flutuante que é definida pela norma 754 do IEEE (Institute of Electrical and Electronic Engineers).
Esta norma utiliza os mesmos princípios da representação do PDP-11, com a diferença de assumeir mantissas com valores absolutos maiores ou iguais a 1 e inferiores a 2, isto é, na forma 1.000etc até 1.111etc
Assim, a vírgula está agora à direita do bit escondido, o dígito mais à esquerda da mantissa, que não precisa de ser representado, por estar sempre a 1.
A norma define dois tipos de representação: a de precisão simples utiliza uma palavra de 32 bits (como o PDP-11) e a de precisão dupla utiliza uma palavra de 64 bits. Há ainda uma outra representação, com maior precisão, dita estendida, com uma palavra de 80 bits. (http://www-asc.di.fct.unl.pt/~jcc/asc1/Teoricas/a12/node5.html)
E se você acha que é algo relacionado ao software proprietário, saiba que o Octave, software livre para cálculos científicos similar ao MatLAB, apresenta o mesmo resultado.
Além disso, ao fazer esse mesmo cálculo na calculadora do GNOME, obtem-se o resultado -0. Como sabemos, -0 não existe, pois o 0 é um número neutro. Segundo a Wikipedia, -0 pode representar tanto um número negativo arredondado para zero ou um número que esteja se aproximando de zero vindo da direção negativa. Na computação, ainda segundo o artigo da Wikipedia, o uso de -0 pode servir para precisão numérica em problemas críticos.
Enfim, qual sua opinião? Quem está certo? Quem está errado? Será que a Matemática deixará de ser uma ciência exata?
Agradecimentos as comunidades Linux vs. Windows e PHP Brasil. Veja mais informações sobre a IEEE 754 na Wikipedia.
2 de fevereiro de 2009 às 16:18
Ótimo post, parabéns ! Mas ainda fico com Gnumeric !
2 de fevereiro de 2009 às 16:19
Bem, até o próprio PHP apresenta este ‘erro’! Tente pra você ver !
3 de fevereiro de 2009 às 11:00
[...] por André Machado (andreferreiramachadoΘgmail·com) – referência [...]
3 de fevereiro de 2009 às 11:22
Acredito que é um problema de precedência do algoritmo porque até onde eu sei o IEEE define como armazenar os números e como efetuar operações entre apenas dois números. Vejam os seguintes exemplos de formula no excel:
Caso 1: =0,5 – 0,4 – 0,1
o resultado é 0 (zero)
Caso 2: =(0,5 – 0,4 – 0,1)
o resultado é -2,77556E-17
Caso 3: =(0,5 – 0,4) – 0,1
o resultado é 0 (zero)
Provavelmente todos os programas pegaram o algoritmo de expressões númericas da mesma fonte literária que deve ser ótimo em eficiência, mas não leva em consideração esses pequenos detalhes.
3 de fevereiro de 2009 às 11:51
No seu texto, quando você diz 1,111etc, eu creio que o correto seria 1,999etc (pois você menciona que o número deverá ser inferior a 2).
Att,
Renato
3 de fevereiro de 2009 às 12:29
errado nenhum está, quem viu a norma compreende por que esse fenômeno acontece (por causa da base 2 na representação de numeros binários e não pela norma em si). Mas acho complicado softwares como esses ficarem vulneráveis a esses erros mais comuns de precisão. Coisa que softwares mais desenvolvidos para calculos matemáticos como o bc (basic calculator só no nome) resolveram, além de trabalhar precisão na casa que você quiser. (com truques)
Tipo calcular o pi com 100 casas. (podem colocar quantas vocês quiserem)
guaxinim@theguide:~$ bc -l
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
1*(0.5-0.4-0.1)
0
scale=100
4*a(1)
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676
3 de fevereiro de 2009 às 12:55
@Renato:
1,999… é exatamente igual a 2
3 de fevereiro de 2009 às 13:34
[...] um post no br-linux de autoria do blog Tuxtoriais que inicia com uma pergunta simples, mas com uma resposta [...]
3 de fevereiro de 2009 às 13:56
No Python também acontece o mesmo problema.
3 de fevereiro de 2009 às 15:23
Na prática, um negócio da ordem de 1e-17 vai ter o mesmo efeito que 0 para a maior parte dos cálculos posteriores (uma possível realidade: se esse resultado for o gasto que você vai ter com alguma coisa, então acabou de gastar 1e-17 reais, que na prática é zero – é quase o inverso do Mol!). Ficar dentro da norma garante que você não vai ter que reinventar a roda sobre como fazer cálculos em ponto flutuante.
3 de fevereiro de 2009 às 22:31
talvez seja mais interessante fazer a conta ’1 / (0,5 – 0,4 – 0,1)’ que no Calc dá o erro: #DIV/0! (Erro: Divisão por zero) e na calculadora do gnome dá -7,060034897e+218
4 de fevereiro de 2009 às 00:31
1 / (0,5 – 0,4 – 0,1) é infinito
4 de fevereiro de 2009 às 01:30
Matemática deixar de ser uma ciência exata? Meu Deus…
Isso ocorre devido a maneira de representar o número na máquina.
Todo número é passado para a notação científica, ou seja:
12345,6 na máquina ficaria 1,23456 x 10^4.
Agora, tome o número 0,000001, que seria representado por 1 x 10^-6. Para somarmos esses dois números, primeiro o computador deve colocá-los na mesma base, ou seja, igualar os expoentes. Se decidirmos igualar pelo primeiro número, teremos que o segundo ficará:
0,0000000001 x 10^4. Logo, a soma daria:
1,2345600001. Mas como o computador não tem essa precisão toda, o segundo número trunca, e fica zero, logo a soma fica igual ao primeiro número.
A matemática é tão exata, que pode até explicar o fenômeno ocorrido.
Ian L.
4 de fevereiro de 2009 às 07:04
O BrOffice Calc 3.0 e a calculadora SpeedCrunch, utilizada pelo Kubuntu 8.04 (Hardy Heron), não apresentam esse problema. O resultado é um zero bem redondo.
4 de fevereiro de 2009 às 11:57
Errado é achar que é mais importante seguir uma norma do que chegar no resultado esperado.
9 de fevereiro de 2009 às 07:56
“Se você fez as contas, deve ter chegado a 0.”
1^0 = 1.
Começou errado
9 de fevereiro de 2009 às 08:16
Uns lêem 1/0, outros 1^0. Creio estarmos com problemas de leitura, não de conhecimentos de álgebra binária.
12 de fevereiro de 2009 às 01:48
Na planilha KSpread v.1.6.3 do KDE v.3.5.9 também 1*(0,5-0,4-0,1) é igual a 0, aumentando a precisão é 0,0000000.
20 de março de 2009 às 19:09
[...] O link para a matéria original segue aqui. [...]