2017-10-16 13 views
-1

J'essaie de créer un programme qui approximera la racine carrée d'un nombre via le théorème de compression. Si un nombre est supérieur à un (l'exemple simple est 100), il définit l'intervalle sur [1, 100], prend le point central et si le carré de ce nombre est supérieur à 100, il met à jour haut et imprime le nouvel intervalle. Si elle est inférieure, elle se met à jour bas jusqu'à ce que l'espace entre eux soit dans EPSILON. Mon problème est que je n'arrive pas à l'obtenir dans l'instruction else pour mettre à jour bas. Toute la sortie avant cela est correcte. Il imprime les cinq premières lignes correctement puis se termine sans mise à jour faible.Programme d'approximation racine carrée Java avec boucle while

public static void main(String[] args) { 

    System.out.println("Enter a number to find its square root -> "); 

    Scanner cin = new Scanner(System.in); 
    double number = cin.nextDouble(); 
    double low = 0; 
    double high = 0; 
    double midPoint; 
    double midPointSqr; 
    final double EPSILON = .000001; 

     if (number < 0) 
      System.out.printf("The square root of %f is NaN%n", number); 
     else if (number < 1) { 
      low = 0; high = 1; 
     } 
     else { 
      low = 1; 
      high = number; 
      midPoint = (low+high)/2; 
      midPointSqr = (midPoint*midPoint); 
      System.out.printf("[%.6f, %.6f]%n", low, high); 
      high = midPoint; 
      System.out.printf("[%.6f, %.6f]%n", low, high); 
      while ((Math.abs(midPoint*midPoint)-number) >= EPSILON) { 
       midPoint = (low+high)/2; 
       if (midPointSqr > number) { 
        high = midPoint; 
        System.out.printf("[%.6f, %.6f]%n", low, high); 
        midPoint = (low+high)/2; 
        midPointSqr = midPoint*midPoint; 
       } 
       else if (midPointSqr == number) 
        System.out.println("null"); 
       else { 
        low = midPoint; 
        System.out.printf("[%.6f, %.6f]%n", low, high); 
        midPoint = (low+high)/2; 
        midPointSqr = midPoint*midPoint; 
       } 
      } 

     } 
/*Output should look like this 
1 Enter a number to find its square root -> 100 
2 [1.000000 , 100.000000] 
3 [1.000000 , 50.500000] 
4 [1.000000 , 25.750000] 
5 [1.000000 , 13.375000] 
6 [7.187500 , 13.375000] 
7 [7.187500 , 10.281250] 
8 [8.734375 , 10.281250] 
9 [9.507813 , 10.281250] 
10 [9.894531 , 10.281250] 
11 [9.894531 , 10.087891] 
12 [9.991211 , 10.087891] 
13 [9.991211 , 10.039551] 
14 [9.991211 , 10.015381] 
15 [9.991211 , 10.003296] 
16 [9.997253 , 10.003296] 
17 [9.997253 , 10.000275] 
18 [9.998764 , 10.000275] 
19 [9.999519 , 10.000275] 
20 [9.999897 , 10.000275] 
21 [9.999897 , 10.000086] 
22 [9.999991 , 10.000086] 
23 [9.999991 , 10.000039] 
24 [9.999991 , 10.000015] 
25 [9.999991 , 10.000003] 
26 [9.999997 , 10.000003] 
27 [9.999997 , 10.000000] 
28 [9.999999 , 10.000000] 
29 [10.000000 , 10.000000] 
*/ 
+0

Aussi, comme vous pouvez le voir, je ne l'ai pas encore rempli l'éventualité d'un nombre compris entre 0 et 1 que je avais croire serait le même sauf pour l'intervalle de départ différent. De plus, l'else si dans la boucle while est simplement un espace réservé - sera supprimé/mis à jour plus tard. – Sabnock66

Répondre

1

Voici ma version de nettoyé votre code:

public static double approximateSqrt(double number) { 
    double low = 0; 
    double high = 0; 
    double midPoint; 
    double midPointSqr; 
    final double EPSILON = .000001; 

    if (number < 0) { 
     System.out.printf("The square root of %f is NaN%n", number); 
     return Double.NaN; 
    } else if (number < 1) { 
     low = 0; 
     high = 1; 
    } else { 
     low = 1; 
     high = number; 
    } 
    midPoint = (low + high)/2; 
    midPointSqr = (midPoint * midPoint); 

    while (Math.abs(midPointSqr - number) >= EPSILON) { 
     System.out.printf("[%.6f, %.6f]%n", low, high); 

     if (midPointSqr > number) { 
      high = midPoint; 
     } else { 
      low = midPoint; 
     } 

     midPoint = (low + high)/2; 
     midPointSqr = (midPoint * midPoint); 
    } 
    System.out.printf("Final. midpoint=%.6f num=%.6f%n", midPoint, number); 
    return midPoint; 
} 

public static void main(String[] args) { 
    System.out.println("Enter a number to find its square root -> "); 
    Scanner cin = new Scanner(System.in); 
    double number = cin.nextDouble(); 
    approximateSqrt(number); 
} 
+2

Pas censé utiliser des commentaires à remercier, mais j'ai simplement demandé à savoir ce qui n'allait pas avec ma boucle/condition, mais à la place - vous avez corrigé le code entier et l'a rendu bien plus propre aussi. Merci beaucoup. – Sabnock66