Olá
fiz um algoritmo para cálculo da raiz quadrada e cheguei a um trecho do código que devia fazer uma somo como a indicada acima, mas apesar de não dar erro de compilação não somava de forma alguma. Eis o código e como resolvi o problema;
double raiz, numero;
…
while (raiz x raiz < numero)
raiz+=0.0000001; --> não dá erro, mas tb não soma
…
solução
while (raiz x raiz < numero)
raiz=raiz+raiz/1000000;
Então, a operação indicada não é possível ser feita diretamente?
Agradeço qualquer ajuda.
Se não for muito extenso, poste o código completo, porque está meio difícil de entender como está dando problema.
Pode ser também um problema de precisão de números flutuantes, que é um problema conhecido em programação (https://stackoverflow.com/questions/12878655/sum-of-float-is-not-exact e https://stackoverflow.com/questions/4858531/double-equals-0-problem-in-c , para referência).
Abraço.
Olá
Obrigado por responder.
Veja o problema é a soma. Usando o VS 2017 da Microsoft e minGW a soma proposta
raiz+=0.0000001 não acontece. O compilador não dá erro, mas não ocorre a soma.
Para introduzir o valor fracionado fiz o que indiquei acima
raiz=raiz+raiz/10000000.
Agora vou olhar o link que mandou, que pode conter a resposta doporque esse forma de indicar a soma não funciona.
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.