2016-10-04 58 views
1

我想製作一個Java應用程序,使用Heron算法計算平方根。但是當我輸入9時,它會在屏幕上打印2.777777910232544。 當我輸入1時,它會打印1.現在我不知道我是否寫了錯誤的代碼,或者我不知道Java中的浮動內容。安卓平方根計算錯誤

這裏是我的代碼:

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

我寫了一個非Android的Java實現蒼鷺的算法從公式在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; 
    } 
} 

你的代碼有長度1 = 1顯示的算法得出(你的length1等於我的x),所以 它沒有從迭代到迭代的進展。

x = s/(float)2可能比1更好的初始估計值,特別是對於較大的值。對於輸入值的小數值,20次迭代可能是過度的。