Dúvida idiota com Python

Iniciado por feliperg, 21 de Dezembro de 2005, 11:10

tópico anterior - próximo tópico

feliperg

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

Z1nhow

Eu não programo em Python, mais pelo visto tu não declarou quantas casas decimais vc q depois da virgula.

feliperg

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.

GDA

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

feliperg

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

GDA

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

feliperg

Humm...
Então quando eu não quiser este tipo de tratamento basta declarar quantas casas decimais eu quero no resultado?
Abraços