2016-10-01 7 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は、第1の入力と2

に算出した出力の減算である。(回答が入力された番号に近づくようにするため)

Iが持っています例外エラーが発生しました。

代わりの& &。(実際には、||これは再帰的にならない)

sun.misc.FloatingDecimal $ BinaryToASCIIBuffer.dtoaでjava.lang.StackOverflowErrorを (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)を使うことです。 –

関連する問題