Saltar para conteúdo


Foto
- - - - -

Erro na calculadora


  • Por favor inicie sessão para responder
13 respostas a este tópico

#1 eddie_gordo

eddie_gordo

    Fã de Android

  • Membros
  • PipPipPip
  • 263 mensagens

Mensagem publicada 26 April 2010 - 19:15

Viva,Hoje deparei-me com um Bug na calculadora de origem do Desire. Ao fazer 0.95-0.9 o resultado que me dá é 0.049999999 quando devia ser 0.05, como é obvio... Acontece isto a mais alguém?Estou agora a sacar a RealCalc que o PJFonseca aconselha no vídeo das várias aplicações úteis para ver se acontece o mesmo.. ;)CumpsEdit: Com a RealCalc já não acontece.. lol Bug estranho...

#2 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 26 April 2010 - 20:08

eddie_gordo escreveu:

Viva,Hoje deparei-me com um Bug na calculadora de origem do Desire. Ao fazer 0.95-0.9 o resultado que me dá é 0.049999999 quando devia ser 0.05, como é obvio... Acontece isto a mais alguém?Estou agora a sacar a RealCalc que o PJFonseca aconselha no vídeo das várias aplicações úteis para ver se acontece o mesmo.. ;)CumpsEdit: Com a RealCalc já não acontece.. lol Bug estranho...

Esse valor é derivado do calculo efectuado pelo processador. Tem tudo a ver com a precisão do calculo. O CPU não sabe o que não numeros decimais, só inteiros. Portanto existem várias técnicas para representar numeros decimais no processador. A mais usada é usando "pontos de precisão". O tipo float tem um ponto de precisão, o double, tem 2. Quanto mais pontos tiver, mais exacto é o valor calculado. (é claro que acrescenta uma maior representação dos dados)Posto isto, o valor nao está errado, no limite até está correto. Simplesmente aprensenta uma precisão pela qual nao esperavas :)

#3 eddie_gordo

eddie_gordo

    Fã de Android

  • Membros
  • PipPipPip
  • 263 mensagens

Mensagem publicada 26 April 2010 - 21:03

Acredito em algumas coisas q disseste e sei que os cálculos sao feitos pelo processador, mas a verdade é que o valor apresentado não é o correcto em nenhuma parte do mundo. Estou a passar valores exactos e não valores aproximado, não há necessidade de fazer arredondamentos sequer... é no mínimo estranho e caricato, e mais ainda quando a outra calculadora devolve o valor correcto... ;)Cumps

#4 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 26 April 2010 - 21:09

eddie_gordo escreveu:

Acredito em algumas coisas q disseste e sei que os cálculos sao feitos pelo processador, mas a verdade é que o valor apresentado não é o correcto em nenhuma parte do mundo. Estou a passar valores exactos e não valores aproximado, não há necessidade de fazer arredondamentos sequer... é no mínimo estranho e caricato, e mais ainda quando a outra calculadora devolve o valor correcto... ;)Cumps

é correcto é. e o problema que encontraste pode simplesmente ser a diferença entre usar o tipo "float" ou o tipo "double"e agora pensa nos seguinte:0.49999999999999999999999999999999999999999999999999999999no limite não é o mesmo que 0.5? é tudo uma questão de precisão. e se vires bem as coisas, o 1º até pode estar mais preciso que o segundo (mas isto só em casos especificos). No teu caso, claramente é erro de precisão, portanto o tipo de variável que foi usada para efectuar os calculos foi o errado.

#5 eddie_gordo

eddie_gordo

    Fã de Android

  • Membros
  • PipPipPip
  • 263 mensagens

Mensagem publicada 27 April 2010 - 09:34

Mais uma vez acredito, mas acho mau este valor ser apresentado para um cálculo tão simples e com apenas duas casas decimais. Em qualquer lado que definas um método que receba dois floats e que devolve a subtracção entre eles, nunca obténs isto. Seja float ou double.Cumps

#6 eddie_gordo

eddie_gordo

    Fã de Android

  • Membros
  • PipPipPip
  • 263 mensagens

Mensagem publicada 27 April 2010 - 09:36

PS - Edita o teu post e tira uns quantos "9999" que tá a dar cabo do layout do forum e a deixar o botao "Submeter" invisível. :(

#7 coolmike

coolmike

    Membro

  • Membros
  • PipPip
  • 55 mensagens

Mensagem publicada 28 April 2010 - 19:48

r3pek...podes falar em precisão... mas por muita precisão que tenhas, uma subtracção nunca ganha mais casas decimais do que que o valor com maior número de casa que lhe deu origem, isto é, se o valor com maior precisão vai até à terceira casa, o resultado NUNCA ultrapassa isso.o que estás a falar aplica-se a a divisões e afins, mas nunca a aritmética simples

#8 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 28 April 2010 - 20:10

coolmike escreveu:

r3pek...podes falar em precisão... mas por muita precisão que tenhas, uma subtracção nunca ganha mais casas decimais do que que o valor com maior número de casa que lhe deu origem, isto é, se o valor com maior precisão vai até à terceira casa, o resultado NUNCA ultrapassa isso.o que estás a falar aplica-se a a divisões e afins, mas nunca a aritmética simples

Quanto queres aqui perder?! :(

#9 coolmike

coolmike

    Membro

  • Membros
  • PipPip
  • 55 mensagens

Mensagem publicada 28 April 2010 - 20:44

erros de precisão levam a arredondamentos e não a "desambiguações"neste caso não se trata de qualquer problema de precisão, pois aquele valor está claramente errado

#10 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 28 April 2010 - 22:32

coolmike escreveu:

erros de precisão levam a arredondamentos e não a "desambiguações"neste caso não se trata de qualquer problema de precisão, pois aquele valor está claramente errado

É apenas um problema de representação por falta de precisao. aredonda o numero a 2 casas decimais e consegues ver que está certo.

#11 coolmike

coolmike

    Membro

  • Membros
  • PipPip
  • 55 mensagens

Mensagem publicada 29 April 2010 - 08:19

estive a rever os calculos de virgula flutuante, e realmente no calculo de A-B onde B é maior que A, é efectuada uma multiplicação e um exponencial... e assim sendo já podem existir erros de precisão!!! (tenho de dar razao ao r3pek)curioso é que se o operando for inferior a .8, não dá problemas

#12 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 29 April 2010 - 08:27

coolmike escreveu:

estive a rever os calculos de virgula flutuante, e realmente no calculo de A-B onde B é maior que A, é efectuada uma multiplicação e um exponencial... e assim sendo já podem existir erros de precisão!!! (tenho de dar razao ao r3pek)curioso é que se o operando for inferior a .8, não dá problemas

Mais giro ainda, é quando começas a usar várias versões do mesmo compilador e com umas versões não dá problema, e com outras dá :PVirgula flutuantes é lixado :(

#13 eddie_gordo

eddie_gordo

    Fã de Android

  • Membros
  • PipPipPip
  • 263 mensagens

Mensagem publicada 29 April 2010 - 12:30

Mas no caso que eu dei, no cálculo A-B, B é menor que A... ;)Cumps

#14 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 29 April 2010 - 13:27

eddie_gordo escreveu:

Mas no caso que eu dei, no cálculo A-B, B é menor que A... ;)Cumps

Mas não sabes como é que o compilador reordenou, ou se reordenou, o código. Como disse, isto é um problema variante, mas que acontece devido ao que disse.