2016-10-04 9 views
1

私は、Heronアルゴリズムを使用して平方根を計算するJavaアプリケーションを作りたかったのです。しかし私が9に入ると、2.777777910232544が画面に表示されます。 私は1を入力すると1を出力します。間違ったコードを書いたのか、Javaで浮動小数点が何か分からないのです。ここでAndroidの平方根計算エラー

私のコードです:

public class MainActivity extends AppCompatActivity { 

float length1; 
float width1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final TextView mainOutput = (TextView) findViewById(R.id.mainOutput); 
    final EditText mainInput = (EditText) findViewById(R.id.mainInput); 
    final Button wurzel2 = (Button) findViewById(R.id.wurzel2); 

    assert wurzel2 != null; 
    wurzel2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      for(int i = 0; i < 20; i++) { 
       float inputNumber = Integer.parseInt(mainInput.getText().toString()); 
       length1 = 1; 
       width1 = inputNumber/length1; 
       float length2 = (length1 + width1)/2; 
       float width2 = inputNumber/length2; 
       length1 = length2; 
       width1 = width2; 
      } 
      double wurzel = length1/width1; 
      mainOutput.setText(String.valueOf(wurzel)); 
     } 
    }); 
} 
} 
+0

[sqrt()関数](https://developer.android.com/reference/java/lang/Math.html#sqrt(double))を使用しないのはなぜですか? –

+0

まあ、私は基本的にsqrt()関数を自分自身で記述したいと思っています。 –

+0

なぜですか?これは、数学ライブラリに既に存在する最適化されたものよりもパフォーマンスが低いことは確かです。 –

答えて

0

私はhttps://en.wikipedia.org/wiki/Methods_of_computing_square_roots

public class MyClass { 
    public static void main(String[] args) { 
     float x = 9; 
     System.out.println(heron(x)); 
    } 

    static float heron(float s) { 
     float x = (float) 1.0; // initial approximation of result 
     for (int i = 0; i < 20; i++) { 
      float sDivX = s/x; 
      x = (x + sDivX)/2; 
      // remove this line in production, this is just to watch progress 
      System.out.println(String.valueOf(x)); 
     } 
     return x; 
    } 
} 

あなたのコードで表示されたアルゴリズムの計算式から派生ヘロンのアルゴリズムの非AndroidのJava実装は、長さ1 = 1を持っていた書きました(あなたのlength1はmy xと同じです)、ループ内で 繰り返しから反復まで進んでいませんでした。

x = s/(float)2は、特に大きな値の場合、初期推定値が1より良い場合があります。入力値の値が小さい場合、反復はおそらく過剰です。