/*
   raiz.c
   ======

   Este programa encontra uma aproximacao para a 
   raiz quadrada de um numero dado.  O programa
   usa o metodo de Newton.
 */

#include <stdio.h>
#include <math.h>

/*
   meu_sqrt(): devolve uma aproximacao da raiz quadrada
   de x.  Usa o metodo de Newton; n e epsilon controlam o 
   numero de iteracoes a serem executadas.
 */

double meu_sqrt(double x, double epsilon, int n);

int main()
{
  double x, epsilon;
  int n;

  printf("x, epsilon, n: ");
  scanf("%lf %lf %d", &x, &epsilon, &n);

  printf("meu_sqrt(%g) = %.20g\n", x, meu_sqrt(x, epsilon, n));
  printf("sqrt(%g) = %.20g (math.h)\n", x, sqrt(x));

  return 0;
}

/*
   meu_sqrt(): devolve uma aproximacao da raiz quadrada
   de x.  Usa o metodo de Newton; n 'e o numero maximo
   de vezes que a recorrencia do metodo de Newton 'e
   aplicada.  Caso a diferenca entre duas aproximacoes
   sucessivas for menor que epsilon, paramos a iteracao e
   devolvemos o valor atual.
 */

double meu_sqrt(double x, double epsilon, int n)
{
  double y = 1, yy = 1;

  while (n > 0) {
    yy = 0.5 * (y + x / y);
    n--;
    if ((yy - y < epsilon) && (y - yy < epsilon))
      break;
    y = yy;
  }

  return yy;
}
