Já parou para pensar pq os números de ponto flutuante são imprecisos em potências diferentes de 2?
Um número é impreciso pq, depois da vírgula, cada bit ligado representa 2^-n, onde n é o número da casa contada da direita pra esquerda, a partir do 1. Assim, o número 2,5 seria representado em binário por:
2 = 10
0,5 = 1
2,5 = 10.1
Agora, considere o esforço de escrever uma fração que não é mútipla de 2, como 0,3, usando potências de 2:
A primeira potência que usaríamos poderia ser 1/4, que é 0,25.
Para melhorar a precisão, podemos somar 1/32, que é 0,03125.
Obteríamos então, 0,28125. E se quiséssemos aumentar ainda mais a precisão?
Daria para somar 1/64, que é 0,015625, e obteríamos 0,296875…
Nosso número já está assim:
0,3 = 0,010011
Poderíamos continuar somando com divisores multiplos de 2 cada vez maiores, mas difícilmente chegaríamos em 0,3. Esse comportamento assintótico é extremamente inconveniente e, para uma base como 2, extremamente frequente.
Com isso, vemos que o sistema de base 2 é muitíssimo pobre para representar números que não podem ser obtidos por frações de 2. E daí que vem essa imprecisão toda. O que o hardware faz é aumentar (muito) o número de bits quando contas envolvendo floats são feitas. Isso atenua o problema, mas não o resolve. Pequenas dicas de programação (como multiplicar antes de dividir, quando possível) também ajudam.
ViniGodoy