Olá ^^

Mês passado me bati com um problema típico da vida quando estamos efetuando cálculos com números em ponto flutuante: Os erros de arredondamento.

Vcs provavelmente já empacaram com esse fenômeno em cálculos manuais. Por exemplo, se vc calcular 1/3 com duas casas decimais, obtém 0,33, certo? Porém, multiplicando novamente por 3, vc obtém 0,99 e n 1,00. Isso é terrível.

Como nós sabemos, no hardware do procesador, números são representados no sistema binário e não no decimal, então teremos erros de arredondamento quando dígitos binários são perdidos. Vc pode encontrá-los em diferente lugares além daqueles que espera. Um exemplo:

Código:
#include <iostream>

using namespace std;

int main(int, char**)
{
          double x = 4.35;
          int n = x * 100;
          cout << n << endl;       //   está imprimindo 434 =O
          return 0;
}
Como sabemos, 100 * 4,35 resulta em 435, mas o programa exibe 434!

Como a maioria dos computadores representam números no sistema binário. No sistema binário, não existe uma exata representação para 4,35, assim como não existe representação exata para 1/3 no sistema decimal. A representação usada pelo computador é ligeiramente menor que 4,35, de modo q 100 vezes este valor é ligeiramente menor que 435. Quando um valor em ponto flutuante é convertido para um inteiro, toda a parte fracionária, que é quase 1, é jogada fora e o inteiro 434 é armazenado em n.

Para evitar esse problema, vc deve sempre adicionar 0,5 a um valor positivo em ponto flutuante antes de transforma-lo para um inteiro.

Código:
double y = x * 100;
int n = y + 0.5;
Somar com 0,5 funciona, pq faz com q valores acima de 434,5 sejam valores acima de 435. Naturalmente, o compilador pode ainda emitir um aviso alertando a insegurança de atribuir um valor em ponto flutuante para uma variável inteira, mas podemos evitar isso reduzindo o warn level do compilador ou, de um jeito melhor, dar um casting com o static_cast

enfim é só, abraços