#include /********************************************************************* Exemplo de função para calcular a raiz quadrada de um número real POSITIVO através de 'refinamentos sucessivos'. Essa função é apresentada apenas a título de exemplo. Na prática a biblioteca oferece a função sqrt() que cumpre o mesmo papel de forma mais eficiente e já exaustivamente testada. Idéia geral do processo usado (ou seja o algoritmo): raiz(x): partir do intervalo (x1,x2) igual a (0,x/2) enquanto o tamanho de intervalo for maior que zero { rq = ponto médio do intervalo (x1,x2) se rq*rq > x então x2 = rq // joga fora a 2a. metade do intervalo senão x1 = rq // joga fora a 1a. metade do intervalo } retornar rq *********************************************************************/ float raiz(float x){ float x1,x2; // variáveis auxiliares que definem o 'intervalo de busca' pela raiz float rq; // mantém o valor calculado float err; // margem de erro (as contas com float nunca são exatas) /* cálculo da margem de erro esperada */ err = x*1.0e-7; /* cálculo da raiz quadrada de x */ x1 = 0; x2 = x; while( x1 < x2){ rq = (x1 + x2) / 2.0; // chute: a raiz é ponto médio do intervalo (x1,x2) if( rq*rq > x) x2 = rq - err; // diminuir o intervalo pela direita else x1 = rq + err; // ou pela esquerda } /*************************************************************** Observação: - ao diminuir o intervalo, a parcela subtraída é acrescida do valor da margem de erro 'err' para garantir que o intervalo é efetivamente diminuido, mesmo no caso em que x1==x2. ***************************************************************/ return rq; } /*********************************************** Teste simples da função raiz() ************************************************/ main(){ float x; // número real cuja raiz quadrada se deseja calcular float r; // para manter o valor de raiz(x) /* entrada do valor de x */ printf("valor de x:"); scanf("%f",&x); r = raiz(x); // chamada da função printf("raiz(%9.7f) = %9.7f r*r:%9.7f\n",x,r,r*r); system("PAUSE"); }