GuiasPor que os conversores de ponto flutuante falham (e como a matemática decimal corrige isso)
Por que os conversores de ponto flutuante falham (e como a matemática decimal corrige isso)
Entenda por que o ponto flutuante binário cria resíduos de conversão estranhos, quando esses erros são importantes e como a aritmética decimal ou racional mantém os conversores de unidades confiáveis.
O clássico problema 0,1 + 0,2 encontra unidades
A maioria das CPUs armazena números não inteiros em ponto flutuante binário (IEEE 754). Frações que parecem simples em decimal – 0,1, 0,001, 2,54 – muitas vezes não podem ser representadas exatamente em binário. O valor armazenado é a aproximação representável mais próxima, e a aritmética nas aproximações acumula pequenos resíduos.
A conversão de unidades multiplica e divide esses valores repetidamente. Converta polegadas em milímetros e vice-versa, ou litros em metros cúbicos e vice-versa, e você poderá ver 2,9999999997 em vez de 3. O fator de conversão física foi exato; a representação do computador não era.
Para muitos monitores a diferença é invisível após o arredondamento. Para dosagem adjacente a finanças, percursos de ferramentas CNC, área de terreno legal ou afirmações de testes automatizados que esperam igualdade exata, esses resíduos tornam-se verdadeiros bugs.
Quais fatores de conversão são exatos no papel
A polegada internacional é exatamente 25,4 mm. O pé internacional tem exatamente 0,3048 m. O litro equivale exatamente a 0,001 m³. Um centímetro cúbico equivale exatamente a 1 mL no sentido normal de laboratório (1 cm³ = 10⁻⁶ m³). Estas são definições, não medidas.
Se o software armazenar 25.4 como um float binário, ele já pode estar um pouco errado antes de qualquer conversão ser executada. Multiplicar por outro fator inexato aumenta o erro. Os testes de ida e volta que afirmam igualdade estrita falham mesmo quando o algoritmo está conceitualmente correto.
A temperatura adiciona compensações: Celsius ↔ Kelvin usa 273,15. Essa constante também é um valor decimal que o binário flutua apenas aproximado. As conversões afins são especialmente sensíveis porque a adição de um deslocamento inexato altera todos os resultados.
Onde os erros de ponto flutuante aparecem na prática
Os conversores de UI geralmente ocultam o problema arredondando para um número fixo de casas decimais. Os usuários veem resultados limpos e nunca percebem o ruído interno. Os problemas aparecem quando outro sistema consome o float bruto: um kernel CAD, uma exportação CSV ou um teste de unidade comparando strings de precisão total.
As conversões encadeadas amplificam os problemas. Ir milha → jarda → pé → polegada → milímetro → metro com flutuadores binários em cada etapa é pior do que uma única conversão de milha → metro com um fator de alta precisão. Cada salto arredonda novamente o valor intermediário.
Quantidades ao quadrado e ao cubo pioram os erros. A área e o volume multiplicam as escalas de comprimento, portanto, um pequeno erro relativo no comprimento torna-se duas ou três vezes maior em termos relativos para área ou volume quando você expande (1+ε)ⁿ.
Alternativas decimais, racionais e de ponto fixo
Bibliotecas decimais (por exemplo decimal.js, Big.js ou decimais nativos da linguagem) armazenam números na base 10. Fatores decimais exatos como 0,3048 e 0,001 permanecem exatos dentro da precisão escolhida. Os conversores de unidades que se preocupam com a correção geralmente convertem por meio de uma unidade de base decimal.
A aritmética racional armazena fatores como frações de inteiros. Se 1 polegada = 127/5.000 metros exatamente (porque 25,4 mm = 127/5.000 m), a multiplicação pode ser cancelada exatamente. Rationals são ideais para conversões em escala pura; as compensações ainda precisam de tratamento cuidadoso em relação à temperatura.
A matemática de ponto fixo dimensiona tudo para uma contagem inteira do menor tick – nanômetros, microlitros ou milésimos de polegada. A aritmética inteira é exata até você transbordar. Funciona bem para domínios com um quantum claro de medição.
Regras práticas para conversores confiáveis
Armazene fatores legais exatos como decimais ou racionais, não como números flutuantes binários digitados às pressas. Converta entrada → base → saída no menor número de etapas possível. Arredonde apenas ao formatar para humanos e documente o modo de arredondamento.
Nunca teste conversores com igualdade estrita em números flutuantes binários. Compare dentro de uma tolerância absoluta ou relativa ou compare formatos de strings decimais com uma precisão declarada. Prefira testes dourados que usam pares exatos conhecidos, como 1 pol. = 25,4 mm.
Se você criar uma interface de calculadora, mostre precisão suficiente para ser útil, mas não tantos dígitos que o ruído flutuante pareça um sinal. Uma ferramenta de comprimento que mostra doze casas decimais após a conversão por meio de números flutuantes está anunciando seu erro de representação.
Quando os carros alegóricos binários ainda estão bem
Comparações aproximadas, jogos, visualização de dados e muitas simulações científicas toleram erros flutuantes porque a incerteza do modelo supera o erro de representação. A chave é conhecer sua tolerância. Se um milímetro importa, os flutuadores precisam de disciplina ou substituição.
A aceleração de hardware e os pipelines de GPU geralmente forçam flutuações. Nesses casos, mantenha a conversão oficial em decimal na CPU ou no servidor e trate os flutuadores da GPU como uma exibição ou aproximação intermediária.
Uma boa engenharia é combinar a representação numérica com a decisão que você tomará com o número. A conversão de unidades para manufatura, medicina e metrologia legal merece matemática decimal ou racional; um widget de clima que converte as temperaturas da cidade, não. Em caso de dúvida, escolha a representação mais estrita — o custo de desempenho dos decimais é geralmente menor que o custo de um bug silencioso de ida e volta.
Conversores relacionados
Perguntas frequentes
Por que a conversão para frente e para trás altera meu número?
O ponto flutuante binário não pode representar exatamente muitos fatores decimais. Cada multiplicação ou divisão adiciona um pequeno erro de arredondamento. A conversão de ida e volta por meio de floats geralmente falha em restaurar os bits originais, mesmo quando os fatores de conversão são conceitualmente exatos.
A precisão dupla é suficiente para conversão de unidades?
A precisão dupla (float64) é suficiente para muitas conversões diárias após o arredondamento da exibição, mas não substitui fatores decimais exatos quando você precisa de viagens de ida e volta com bits estáveis, metrologia legal ou testes automatizados rigorosos. Prefira decimais ou racionais para conversores oficiais.
Como devo comparar os resultados do conversor em testes?
Compare com uma precisão declarada, use igualdade de string decimal ou declare tolerâncias absolutas e relativas. Evite esperar igualdade binária exata após várias etapas aritméticas.