Autor Tópico: Dúvida idiota com Python  (Lida 8437 vezes)

Offline feliperg

  • Usuário Ubuntu
  • *
  • Mensagens: 36
    • Ver perfil
Dúvida idiota com Python
« Online: 21 de Dezembro de 2005, 11:10 »
Fala pessoal!
Tipo, eu nunca me aventurei em programação e graças a isso não sei absolutamente nada. Huaehuaehaeuh
Mas eu começei a tentar aprender Python pq me falaram que era uma linguagem de fácil aprendizado.
Eu mal iniciei e vi uma parada que eu não sei se é normal ou se é um bug.
Eu digito uma experssão aritmética simples e o Python retorna um resultado esquisito.
Por exemplo:
>>> 5 * 1.717
8.5850000000000009
>>>

O resultado na verdade devia ser somente 8,585.
Pq isso acontece? :?

Abraços

Offline Z1nhow

  • Usuário Ubuntu
  • *
  • Mensagens: 201
    • Ver perfil
Dúvida idiota com Python
« Resposta #1 Online: 21 de Dezembro de 2005, 12:12 »
Eu não programo em Python, mais pelo visto tu não declarou quantas casas decimais vc q depois da virgula.

Offline feliperg

  • Usuário Ubuntu
  • *
  • Mensagens: 36
    • Ver perfil
Dúvida idiota com Python
« Resposta #2 Online: 21 de Dezembro de 2005, 12:41 »
Eu tbm pensei nisso, mas creio que isso não seja motivo pro Python retornar um resultado errado, já que 5 * 1.717 não é 8.5850000000000009 e sim 8,585.

Offline GDA

  • Usuário Ubuntu
  • *
  • Mensagens: 92
    • Ver perfil
Não tão idiota assim...
« Resposta #3 Online: 21 de Dezembro de 2005, 14:34 »
Mas o problema não é exatamente com o Python, mas na forma como os valores numéricos são tratados de acordo com o seu tipo. Em operações de ponto flutuante, um valor inteiro pode vir a ser tratado pelo computador como um real de valor muito aproximado... Por exemplo, o seu "5", estaria sendo visto como um "4.99999999999999" ou um "5,000000000001" (não contei as casas decimais...), por causa da notação binária que representa tipos de dados longos (double, long, float, etc...).

A participação do Python nessa sua continha está no fato de ele definir o tipo de dado de acordo com os valores que participam da operação. Como vc tm um número com ponto flutuante na divisão, o valor (aparentemente) inteiro é interpretado como um dado tipo ponto flutuante, o que nos leva ao problema que falei acima.

Confuso? Nem tanto... ;)

Abração!
jabber: droopalong@jabber.org - Ubuntu'ser:
Interessado em aprender mais sobre o Ubuntu em português? Comece aqui

Offline feliperg

  • Usuário Ubuntu
  • *
  • Mensagens: 36
    • Ver perfil
Dúvida idiota com Python
« Resposta #4 Online: 21 de Dezembro de 2005, 16:29 »
Mas este tipo de tratamento é bem estranho.
Qual exatamente é a vantagem disso em termos de programação?
E teria um jeito de reverter esse tipo de tratamento?
Abraços

Offline GDA

  • Usuário Ubuntu
  • *
  • Mensagens: 92
    • Ver perfil
Dúvida idiota com Python
« Resposta #5 Online: 21 de Dezembro de 2005, 17:41 »
Não é estranho... é muito prático! Afinal, se uma das parcelas dessa operação é flutuante, o mais lógico é imaginar que vc queira um resultado também flutuante. :)

Na verdade, eu me expressei mal na resposta anterior, e isso deve ter causado a impressão de estranheza. Eu disse que o Python vai tratar o inteiro "5" como um float, mas o que ele realmente faz é deduzir que vc quer o resultado em float, portanto o erro vem da representação do próprio resultado.

O erro de ponto flutuante, a propósito, é uma característica dependente da plataforma, e tem a ver principalmente com a CPU e o SO, e não é exatamente um problema da linguagem que se usa.
jabber: droopalong@jabber.org - Ubuntu'ser:
Interessado em aprender mais sobre o Ubuntu em português? Comece aqui

Offline feliperg

  • Usuário Ubuntu
  • *
  • Mensagens: 36
    • Ver perfil
Dúvida idiota com Python
« Resposta #6 Online: 21 de Dezembro de 2005, 18:25 »
Humm...
Então quando eu não quiser este tipo de tratamento basta declarar quantas casas decimais eu quero no resultado?
Abraços