2016-10-21 6 views
3

は、私がこれまで持っているものです。平方根ここ/ 2

Public static double Sqrt (double a){ 
    double xOld = a/2; 
    double xNew = 0; 
    while (Math.abs(xOld - xNew) >= 0.0001 { 
       xNew = (xOld + a/xOld)/2; 
       xNew = xOld; 
    } 
} 

私はアルゴリズム×1 =(X0 -/X0)を使用する必要があります/ 2数の近似平方根を求める。 aは元の数であり、x0は値a/2で始まります。このコードを実行すると、私は12.5(これはa/2)になります。何が助けが必要なのは、初期化するxNewの値とwhileループの最後の行です。助けをありがとう

+0

あなたはこの数式を取得したのですか? –

答えて

0

あなたのループの最後に、おそらくあなたが望むものがあります。これは今設定されているように、あなたが今計算したxNewの値を直ちに上書きします。

しかし、上記は十分ではありません。ループの最後にxNewxOldを等しければ、テスト条件が与えられればwhileループが次のパスで終了することを保証します。 whileループには、Math.abs(a - xNew*xNew) >= 0.0001などの異なる条件を使用してみてください。

もう1つの方法は、テスト条件をそのままにしておくことですが、whileループで2つのステートメントの順序を入れ替える必要がありますが、割り当てはまだxOld = xNewです。 SIZE FOR

+0

いいえ、一時変数 'temp = xNew'を導入し、' xNew'を変更した後、 'Xnew = xOld'を' xOld = temp'に置き換える必要があります。 –

+0

それもうまくいくでしょう。上記の3番目の段落で提案された方法と比較して余分な変数が追加されますが、概念化するのは簡単かもしれません。 –

1

TRY THISをON:

Public static double Sqrt(double a) throws IllegalArgumentException { 

    if (a < 0.0) throw new IllegalArgumentException(); 

    double aSqrt = a/2.0; 
    while (Math.abs(a - aSqrt*aSqrt) >= 0.0001) { // I'd use a smaller tolerance 
      double aSqrtPrev = aSqrt; 
      aSqrt = (aSqrtPrev + a/aSqrtPrev)/2.0; 
    } 

    return aSqrt ; 
}