/* Calcul d'une racine carree                  */

public class RacineCarree {
  
/////////////////////////////////////////////////

/* Constante de definition de la precision     */
/* de calcul                                   */

  static final double EPSILON = 0.00000000000001;
  
/* Fonction recursive de calcul et retour      */
/* de la racine carree d'un nombre reel        */
/* que l'on sait être comprise                 */
/* dans l'intervalle [a,b]                     */
/* x : le nombre dont on souhaite calculer     */
/*     la racine carree                        */
/* a : la borne minimale de l'intervalle       */
/*     de recherche                            */
/* b : la borne maximale de l'intervalle       */
/*     de recherche                            */

  static double racine(double x,double a,double b) {
    double res;
    double m = (b+a)/2.0;
    if ( b-a > EPSILON ) {
      if ( m*m > x ) {
        res = racine(x,a,m); }
        else {
        res = racine(x,m,b); } }
      else {
      res = m; }
    return res;
  }
    
/* Fonction de calcul et retour                */
/* de la racine carree d'un nombre reel        */
/* compris dans l'intervalle [0.0,1.0]         */
/* x : le nombre dont on souhaite calculer     */
/*     la racine carree                        */

  static double racineCarree(double x) {
    double v = racine(x,0.0,1.0);
    return v;
  }

/////////////////////////////////////////////////
  
/* Programme principal                         */

  public static void main(String [] args) {
    double x;
    double racine;
    Ecran.afficher("Valeur ? ");
    x = Clavier.saisirDouble();
    racine = racineCarree(x);
    Ecran.afficherln("Racine : ",racine);
    Ecran.afficherln("Sqrt   : ",Math.sqrt(x));
  }
}