2016-10-01 2 views
0

Я написал код, чтобы получить квадратный корень, используя вавилонский метод.Вавилонский метод рекурсии исключение: stackOverFlow

Прошу указать номер пользователя, затем спросите пользователя.

public class JanghyupLee_H02 { 

private double number; 
private double guess; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String input; 
    Scanner userInput = new Scanner(System.in); 

    JanghyupLee_H02 AR = new JanghyupLee_H02(); 

    System.out.println("Type a number : "); 
    input = userInput.next(); 

    if (input.equals("0") || input.equalsIgnoreCase("exit") || input.equalsIgnoreCase("no")) { 
     System.exit(0); 

    } else { 

     AR.setNumber(Integer.parseInt(input)); 

    } 

    System.out.println("Type your guess : "); 
    input = userInput.next(); 

    if (input.equals("0") || input.equalsIgnoreCase("exit") || input.equalsIgnoreCase("no")) { 
     System.exit(0); 
    } else { 

     AR.setGuess(Double.parseDouble(input)); 

     double newGuess = AR.getGuess(); 

     AR.testGuess(newGuess); 

    } 

} 

public double getNumber() { 
    return number; 
} 

public void setNumber(double inputNumber) { 
    this.number = inputNumber; 
} 

public double getGuess() { 
    return guess; 
} 

public void setGuess(double guessNumber) { 
    this.guess = guessNumber; 
} 

public double testGuess(double guess) { 
    double guessAcurracy = (getNumber() - (getGuess() * getGuess())); 

    //exeption error here 
    if ((guessAcurracy == 0) && (guessAcurracy <= 0.000005)) { 
     System.out.println(guess); 

     return guess; 
    } else { 

     setGuess((((0.5) * (getGuess() + getNumber()/getGuess())))); 
     System.out.println(guess); 
     System.out.println("---------------------"); 
     return testGuess(getGuess()); 
    } 

} 

}

В основном, guessAcuraccy является вычитание первого входа и два в

сигнал, подаваемый на. (Так что ответ ближе к входному номеру)

У меня есть ошибка исключения там,

, даже если я написал || вместо & &. (на самом деле, || это не идет рекурсивное)

Исключение в потоке "главный" java.lang.StackOverflowError в sun.misc.FloatingDecimal $ BinaryToASCIIBuffer.dtoa (FloatingDecimal. Java: 431) в sun.misc.FloatingDecimal $ BinaryToASCIIBuffer.access $ 100 (FloatingDecimal.java:259)

я получаю эти ошибки исключения,

, пожалуйста, дайте мне знать, что здесь не так.

+0

Вы пробовали преодолеть это с помощью отладчика? Удивительно, что вы можете это сделать. – pjs

ответ

1

Это выглядит подозрительно:

double guessAcurracy = (getNumber() - (getGuess() * getGuess())); 

Для сравнения квадратов, это должно быть:

double guessAcurracy = (getNumber() * getNumber() - (getGuess() * getGuess())); 

Или еще проще/обычно/эффективно:

double guessAcurracy = Math.abs(getNumber() - getGuess()); 

Это выглядит подозрительно слишком:

if ((guessAcurracy == 0) && (guessAcurracy <= 0.000005)) { 
    // stop recursion 

рекурсия останавливается только в том случае, если guessAcurracy точно равен нулю, что для расчета с плавающей точкой маловероятно.

Удалите полностью испытание на равенство с нулем.

+0

Как я уже упоминал выше, я попытался изменить его на ||, но это не сработало –

+0

@jan см. Обновление для вашей ошибки – Bohemian

+0

Как сказал богемский: это не сработает. (guessAcurracy == 0) && (guessAcurracy <= 0.000005) равно просто (guessAcurracy == 0). То, что вы хотите сделать, - использовать (guessAcurracy <= 0.000005). –

Смежные вопросы