Vc acertou em cheio com o link que me ofereceu. O problema é de representação. O 0.0000001 não é igual ao número real 0.0000001. Usando double, como ele possui mais precisão (casas decimais) que float, a soma se realiza. No código de texto que pus indiquei a variável como double, mas no meu original está float. Mudei de float para double e a soma aconteceu como eu queria (raiz+=0.0000001). O interessante é que a alternativa que eu fiz, usando float é a mesma dada na explicação do porque a soma não ocorre com float. Eis a explicação dada para quem está curioso.
trecho do código sugerido para se fazer para perceber o comportamento inesperado da soma
int main () { float x = 0.0001; float y = 0; for (int i=0; i < 10000; i++) { y += x; } cout << y << endl;
y=1.00005 em vez de apenas 1.
Explicação:
Como o comportamento real deste programa difere de seu comportamento esperado? -O comportamento real deste programa é somar a representação IEEE de 0,0001 até 10000 vezes; Representação IEEE de 0,0001! = 0,0001 real
Por que o comportamento esperado não é visto? - Nós assumimos que 0.0001 é exatamente representado como 0.0001, na realidade não é porque os pontos flutuantes IEEE não podem representar 0.0001 exatamente, mas porque têm que representar todos os pontos flutuantes em base2 ao invés de base10.
Embora a semântica do programa permaneça a mesma, quais alterações faria nesse programa para garantir que o comportamento esperado e o comportamento real coincidam? Mudar float para double irá funcionar neste caso, porque double dá a você mais precisão decimal do que float. Solução alternativa é manter float e, em vez de somar, você designa y = 10000 * x (isso causa menos erros e é melhor quando você procura evitar erros de arredondamento e aproximação).
Questão RESOLVIDA.