Representação de ponto flutuante

Double precision floating point structure
Isto é de programação em nível meio baixo, então se você não gosta de baixo nível, pode ser melhor pular este artigo.

Em uma lista da qual eu faço parte, mas que pelas próprias regras não pode ser nomeada (um tipo de lista Voldemort), alguém mencionou que na ferramenta de calculadora do Mac OS X, ao tentar executar a seguinte operação:

118398.42 * 2

Obtém-se o seguinte resultado:

236796.839999999997

Na hora eu lembrei das restrições de ponto flutuante com relação à incapacidade de expressar boa parte dos números, como no resultado acima. Um teste no excel deu o resultado correto: 236796.84, mas imaginei que isso fosse porque o Excel talvez utilize ponto fixo para essas contas, já que trata de dados financeiros, para os quais arredondamento é proibido.

Acontece que alguém surgiu com um algoritmo que eu nunca tinha visto e que realmente faz todo o sentido: ao invés de expressar todos os dígitos possíveis do número, simplesmente expresse o número mais simples cuja representação em ponto flutuante é equivalente ao número dado.

Se você fizer a conta, vai ver que 236796.84 == 236796.839999999997 e portanto e uma representação perfeitamente razoável para esse número em ponto flutuante. Então, por que motivo nós não aprendemos a fazer isso na faculdade ou nos cursos de computação? Por que eu nunca pensei nisso como sendo um problema?

Uma implementação em python está abaixo, bem como uma certa discussão sobre o motivo, e implementações que fazem isso corretamente (javascript, por incrível que pareça, faz). O autor acredita que parte da culpa é da restrição de acesso aos artigos da ACM:

Python: poor printing of floating point « code monk

Tags: , , , , ,

Leave a Reply