2017-02-21 4 views
0

J'ai créé une méthode de racine carrée babylonienne récursive, mais je voudrais incorporer une erreur. Je veux que le programme s'arrête lorsque le numéro de test est + ou - l'erreur pour la racine carrée réelle. Dans ce cas, le programme s'arrêterait à 5.015 .... puisque 5.015 est à 0,1 de la racine carrée réelle (5).Racine carrée babylonienne récursive de travail, besoin d'incorporer une erreur.

public class BabyRoot { 
private static double testnum = 0; 
private static double targetnum = 0; 
private static double error = 0; 

public static void babyRoot(double num) { 
    testnum = 0.5 * (testnum + (targetnum/testnum)); 
    System.out.println("Test number equals: " + testnum); 
    if ((testnum * testnum) == targetnum) 
     System.out.println("The correct square root is: " + testnum); 
    else 
     babyRoot(testnum); 
} 

public static void main(String[] args) { 
    error = 0.1; 
    testnum = 25; 
    targetnum = testnum; 
    babyRoot(testnum); 
} 

} 

Sortie:

Test number equals: 13.0 

Test number equals: 7.461538461538462 

Test number equals: 5.406026962727994 

Test number equals: 5.015247601944898 

Test number equals: 5.000023178253949 

Test number equals: 5.000000000053722 

Test number equals: 5.0 

The correct square root is: 5.0 
+2

Ok merci pour nous laisser savoir. Quelle est votre question? Est-ce que ce n'est pas juste une simple question de soustraire les deux nombres, en prenant la valeur absolue (si nécessaire), et en l'insérant dans une instruction if? – tnw

+1

Y a-t-il une raison pour laquelle vous ne pouvez pas mettre cette vérification dans votre programme? cela semble être une condition plutôt simple. –

+1

Etes-vous sûr que c'est comme cela que vous souhaitez définir l'erreur? Dans les calculs numériques, vous n'avez pas toujours le privilège d'une réponse "vraie" facilement disponible, donc habituellement la valeur d'erreur est utilisée différemment (par exemple la différence entre le résultat dans deux itérations consécutives, ou la différence quand vous faites un calcul inverse). – RealSkeptic

Répondre

1

Vous devez changer votre instruction if pour vérifier si le nombre est dans la plage de targetnum-error et targetnum+error:

public static void babyRoot(double num , double err) 
{ 
    testnum = 0.5 * (testnum + (targetnum/testnum)); 
    System.out.println("Test number equals: " + testnum); 

    if ((testnum >= (Math.sqrt(targetnum) - err)) && 
     (testnum <= (Math.sqrt(targetnum) + err))) 
     System.out.println("The correct square root is: " + testnum); 
    else 
     babyRoot(testnum); 
} 
+2

Ah vous avez raison @RealSkeptic. J'ai mis à jour ma réponse en conséquence. – Peter

+0

Merci à vous deux! C'est exactement ce dont j'avais besoin. – dguerrero