Python квадрат root проблема с L oop, возвращает низкую десятичную точность - PullRequest
1 голос
/ 11 марта 2020

Нам нужно найти квадрат root приближения. Первое приближение:

x_0 = n / 2

, где n - число, в котором мы имеем квадратный корень. Тогда k-аппроксимация будет иметь вид:

x_(k+1) = (x_k + n / x_k) / 2

. Проблема в том, что нам нужно найти аппроксимацию квадрата root, для которого его квадрат находится в диапазоне числа a. Другими словами, в пределах abs(n-a)

Итак, моя попытка решить эту проблему:

def square_root_precision(n, a):
    approx_zero = n / 2
    approx_one = 0
    while approx_one ** 2.0 <= abs(n - a):
        approx_one = (approx_zero + n / approx_zero) / 2
        approx_zero = approx_one
    return approx_one

Итак, проблема в том, что моя функция для n = 2 и a = 0.000001 вместо этого возвращает 1.5 из 1.4142135623746899

Я много раз просматривал код. Это проблема точности функции?

Было бы здорово, если бы мы решили эту проблему только с помощью циклов и без расширенных функций.

Ответы [ 2 ]

4 голосов
/ 11 марта 2020

abs(n - a) оценивается как 1.999999, и как только approx_one оценивается до 1.5, 1.5 * 1.5 >= 1.999999, так что возвращается 1.5.

Вы хотите заменить approx_one ** 2.0 <= abs(n - a) с абсолютной разницей между вашим недавно вычисленным приближением и последним, которое меньше a.

Например:

def square_root_precision(n, a):
    approx_zero = n / 2
    approx_one = 0
    while True:
        approx_one = (approx_zero + n / approx_zero) / 2
        if abs(approx_one - approx_zero) < a:
            return approx_one
        approx_zero = approx_one

square_root_precision(2, 0.001)

1.4142135623746899

3 голосов
/ 11 марта 2020

Условие для l oop должно быть while abs(approx_one**2.0 - n) > a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...