Precisão de ponto flutuante C ++ [duplicado]

Possível duplicado:
Exemplos de imprecisão de ponto flutuante

double a = 0.3;
std::cout.precision(20);
std::cout << a << std::endl;

resultado: 0.2999999999999999889

double a, b;
a = 0.3;
b = 0;
for (char i = 1; i <= 50; i++) {
  b = b + a;
};
std::cout.precision(20);
std::cout << b << std::endl;

resultado: 15.000000000000014211

Então .. 'a' é menor do que deveria ser. Mas se tomarmos 'a' 50 vezes - o resultado será maior do que deveria ser.

Por que é isso? E como obter o resultado correto neste caso?