Quem está certo e quem está errado?

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.

Anúncios

19 Respostas to “Quem está certo e quem está errado?”

  1. jotavrj Says:

    Ótimo post, parabéns ! Mas ainda fico com Gnumeric ! 😀

  2. jotavrj Says:

    Bem, até o próprio PHP apresenta este ‘erro’! Tente pra você ver !

  3. Normatização vs. Realidade: o que considerar certo ou errado na hora H? Says:

    […] por André Machado (andreferreiramachadoΘgmail·com) – referência […]

  4. Carlos Says:

    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.

  5. Renato S. Yamane Says:

    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

  6. guaxinm Says:

    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

  7. Jack Ripoff Says:

    @Renato:

    1,999… é exatamente igual a 2

  8. Tire a prova real e veja quem está certo ou errado… | makeall Says:

    […] um post no br-linux de autoria do blog Tuxtoriais que inicia com uma pergunta simples, mas com uma resposta […]

  9. Tarcísio Says:

    No Python também acontece o mesmo problema.

  10. Tiago Says:

    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.

  11. Mythus Says:

    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

  12. bla Says:

    1 / (0,5 – 0,4 – 0,1) é infinito

  13. Ian Liu Says:

    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.

  14. Aniruddha Dasa Says:

    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.

  15. Brother Wolf Says:

    Errado é achar que é mais importante seguir uma norma do que chegar no resultado esperado.

  16. Colla Says:

    “Se você fez as contas, deve ter chegado a 0.”

    1^0 = 1.
    Começou errado 🙂

  17. Colla Says:

    Uns lêem 1/0, outros 1^0. Creio estarmos com problemas de leitura, não de conhecimentos de álgebra binária. 😦

  18. LCBLima Says:

    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.

  19. Arredondamentos, ponto flutuante « Demitre Da Col Says:

    […] O link para a matéria original segue aqui. […]


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: