2016-10-04 5 views
1

Я хотел создать приложение Java, которое вычисляет квадратный корень, используя алгоритм Heron. Но когда я вхожу в 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

Почему? Это будет, безусловно, менее результативным, чем оптимизированный, уже присутствующий в библиотеке Math. –

ответ

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; 
    } 
} 

Ваш код был length1 = 1 (ваша длина 1 эквивалентна моему x) внутри цикла, поэтому не продвинулся с итерации на итерацию.

x = s/(float)2 может быть лучшей начальной оценкой, чем 1, особенно для больших значений. 20 итераций, вероятно, переполнены для небольших значений входного значения.