mardi 17 novembre 2015

Calculer la racine carrée positive d'un double

Il s'agit d'écrire une classe servant à calculer la racine carrée d'un nombre réel de type double sans utiliser la méthode de la classe java.lang.Math effectuant ce calcul mais par une approche par dichotomie. Ce nombre sera envoyé comme argument sur la ligne de commande après le nom de la classe contenant la méthode main.

On ne traitera pas le cas où on demanderait d'extraire la racine carrée d'un nombre négatif. Un autre exercice, utilisant les exceptions, remédiera à ce défaut.

On récupérera le programme ici présent pour le compléter. La classe Racine proposée contient un attribut privé (déclaré private), l'attribut precision, ce qui entraîne que cet attribut n'est pas directement accessible depuis une autre classe.

La méthode main de la classe EssaiRacine.java vous permettra de tester votre travail.
/*
class EssaiRacine {
    public static void main(String[] arg) {
 Racine extracteur = new Racine(0.01);
 double operande = Double.parseDouble(arg[0]);
 double valeurRacine;

 valeurRacine = extracteur.racine(operande);
 System.out.printf("Racine de %f = %.5f\n", operande, valeurRacine);
 System.out.printf("Avec la precision %.5f, erreur = %.5f\n",
     extracteur.getPrecision(), valeurRacine - Math.sqrt(operande));

 extracteur.setPrecision(0.00001);
 valeurRacine = extracteur.racine(operande);
 System.out.printf("Racine de %f = %.5f\n", operande, valeurRacine);
 System.out.printf("Avec la precision %.6f, erreur = %.6f\n",
     extracteur.getPrecision(), valeurRacine - Math.sqrt(operande));
 
    }
}

/* On obtient pour :
java EssaiRacine 64 :

Racine de 64.000000 = 8.00391
Avec la precision 0.01000, erreur = 0.00391
*/

Corrigé

RacineExc.java.

/
public class Racine  {
    private double precision;
    
    public Racine(double precision) {
 this.precision = precision;
    }
    
    public double racine(double operande) {
 double solution, carre, a, b;
 
 a = 0;
 b = operande;
 solution  =(a+b)/2;
 while (b - a > precision) {
  carre = solution * solution;
       if (carre > operande) b = solution;
       else a = solution;
       solution = ( a + b) / 2;
     }
 return solution;
    }
    
    public double getPrecision() {
 return precision;
    }
    
    public void setPrecision(double precision) {
 this.precision = precision;
    }
}

/

2 commentaires: