2016-10-21 1 views
3

Вот то, что я до сих пор:Квадратный корень Итерация с использованием x1 = (x0 - а/x0)/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; 
    } 
} 

мне нужно использовать алгоритм x1 = (x0 - а/x0)/2 найти приблизительный квадратный корень из числа. a - исходное число, а x0 начинается со значения a/2. Когда я запускаю этот код, я получаю 12.5 (что равно/2). Мне нужна помощь в том, что инициализируется значением xNew и последней строкой цикла while. Спасибо за любую помощь

+0

Где вы взяли эту формулу? –

ответ

0

Возможно, вы хотите, чтобы в конце вашего цикла было xOld = xNew, так как он настроен сейчас, вы сразу же перезаписываете значение xNew, которое вы только что вычислили.

Но этого недостаточно. С xNew и xOld, равными в конце цикла, вы гарантируете, что цикл while выйдет на следующий проход, учитывая условие теста. Попробуйте использовать другое условие для цикла while, например Math.abs(a - xNew*xNew) >= 0.0001 или аналогичного.

Другим способом сделать это было бы сохранить ваше тестовое условие как есть, но тогда вам придется поменять порядок двух операторов в цикле while, по-прежнему выполнять назначение xOld = xNew.

+0

нет, вам нужно ввести временную переменную 'temp = xNew', затем после изменения' xNew' заменить 'Xnew = xOld' на 'xOld = temp'. –

+0

Это тоже сработает. Он добавляет дополнительную переменную по сравнению с тем, что предлагается в третьем абзаце выше, но может быть проще концептуализировать. –

1

TRY THIS для размера:

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

 Смежные вопросы

  • Нет связанных вопросов^_^