Floats São Estranhos

A aritmética de ponto flutuante frequentemente surpreende programadores porque ela aproxima números reais e pode perder precisão em operações comuns como subtrair valores quase iguais, como ilustrado por exemplos envolvendo `exp(x) - 1` e técnicas para “cancelar” ruído numérico. Os comentadores exploram conceitos de análise numérica como cancelamento catastrófico, reformulações estáveis (por exemplo, usar `expm1` ou formas algébricas alternativas) e ferramentas como soma de Kahan ou Herbie que ajudam a reescrever fórmulas para melhor precisão. Um tema importante é quando floats são inadequados — especialmente para dinheiro e contabilidade — e como educação, bibliotecas e tipos numéricos alternativos (decimal, ponto fixo, inteiros grandes) são cruciais para usar computação numérica com segurança.

Comportamento de floats e cancelamento catastrófico

  • Muitos comentários enfatizam que floats não são “estranhos” tanto quanto são aproximações de precisão limitada dos reais; subtrair valores quase iguais inevitavelmente perde dígitos significativos.
  • O exemplo “mágico” do artigo é discutido: a função g(x) = (exp(x)-1)/log(exp(x)) cancela em grande parte o ruído de arredondamento compartilhado entre numerador e denominador, enquanto f(x) = (exp(x)-1)/x não faz isso.
  • Esse cancelamento funciona apenas dentro de um intervalo; para x muito pequeno, ele falha (por exemplo, divisão por zero quando log(exp(x)) arredonda para 0).
  • Vários observam que isso é sobre estabilidade algorítmica, não apenas sobre “floats serem ruins”.

Técnicas numéricas e ferramentas

  • Recomendação: use expm1(x) para exp(x)-1 perto de zero; o math.expm1 do Python é destacado, incluindo sua implementação inspirada em Kahan.
  • Regras gerais de bolso:
    • Evite subtrair números quase iguais.
    • Evite somar números de magnitudes muito diferentes.
    • Para somas, use Kahan ou soma por pares, ou some primeiro os termos de menor magnitude.
    • Compute offsets a partir de 1 (por exemplo, expm1) quando os valores estiverem próximos de 1.
  • Herbie é mencionado como uma ferramenta que sugere reformulações mais estáveis.
  • Algumas bibliotecas são citadas (por exemplo, decimal.js), e também que muitas linguagens expõem IEEE-754 e funções libm de C, às vezes com suas próprias correções para imprecisões conhecidas.

Floats vs dinheiro e cálculos de negócios

  • Visão forte: nunca use floats para contabilidade; use inteiros ou tipos decimais para evitar surpresas de arredondamento em faturas, preços e totais visíveis ao cliente.
  • Visão contrária: para muitos modelos financeiros (juros, títulos, opções, simulações de risco), floats são a ferramenta certa; a incerteza nas entradas supera o arredondamento de centavos, e abordagens inteiras/de ponto fixo tornam-se complexas e frágeis.
  • Meio-termo:
    • Use formatos exatos de inteiro/decimal para armazenamento, liquidação e aritmética voltada ao cliente.
    • Use floats em camadas analíticas/de previsão, onde centavos exatos são menos críticos.
  • Pontos flutuantes decimais (IEEE decimal, hardware IBM) e ponto fixo em “centavos inteiros” são discutidos como alternativas, cada uma com seus trade-offs.

Educação, numérica como disciplina

  • Vários argumentam que os mal-entendidos vêm de educação ruim: estudantes aprendem reais e depois recebem floats sem serem ensinados sobre representação, arredondamento ou estabilidade.
  • A análise numérica é destacada como uma disciplina completa; estabilidade algorítmica e análise de erro importam tanto quanto a escolha do formato numérico.