Как рассчитать квадратный корень в Python? - PullRequest
112 голосов
/ 07 марта 2012

Почему Python дает «неправильный» ответ?

x = 16

sqrt = x**(.5)
returns 4

sqrt = x**(1/2)
returns 1

Да, я знаю import math и использую sqrt.Но я ищу ответ на вышесказанное.

Ответы [ 9 ]

215 голосов
/ 07 марта 2012

sqrt=x**(1/2) выполняет целочисленное деление. 1/2 == 0.

Итак, вы вычисляете x (1/2) в первом случае, x (0) во втором.

Так что это не так, это правильный ответ на другой вопрос.

97 голосов
/ 07 марта 2012

Вы должны написать: sqrt = x**(1/2.0), в противном случае выполняется целочисленное деление, и выражение 1/2 возвращает 0.

Это поведение "нормальное" в Python 2.x, тогда как в Python3.x 1/2 оценивается как 0.5.Если вы хотите, чтобы ваш код Python 2.x вел себя как 3.x с делением, напишите from __future__ import division - тогда 1/2 оценивается как 0.5, а для обратной совместимости 1//2 будет равно 0.

И для записи, предпочтительный способ вычисления квадратного корня такой:

import math
math.sqrt(x)
19 голосов
/ 03 апреля 2018
import math
math.sqrt( x )

Это тривиальное дополнение к цепочке ответов. Однако, поскольку тема очень популярна в Google, я думаю, это стоит добавить.

10 голосов
/ 07 марта 2012

/ выполняет целочисленное деление в Python 2:

>>> 1/2
0

Если одно из чисел является числом с плавающей точкой, оно работает как положено:

>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0
7 голосов
/ 07 марта 2012

То, что вы видите, является целочисленным делением.Чтобы получить деление с плавающей запятой по умолчанию,

from __future__ import division

Или можно преобразовать 1 или 2 из 1/2 в значение с плавающей запятой.

sqrt = x**(1.0/2)
1 голос
/ 25 января 2018

Возможно, будет немного поздно ответить, но самый простой и точный способ вычисления квадратного корня - это метод Ньютона.

У вас есть число, для которого вы хотите вычислить его квадратный корень (num), и у вас есть предположение о его квадратном корне (estimate). Оценка может быть любым числом больше 0, но число, которое имеет смысл, значительно сокращает глубину рекурсивного вызова.

new_estimate = (estimate + num / estimate) / 2

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

def newtons_method(num, estimate):
    # Computing a new_estimate
    new_estimate = (estimate + num / estimate) / 2
    print(new_estimate)
    # Base Case: Comparing our estimate with built-in functions value
    if new_estimate == math.sqrt(num):
        return True
    else:
        return newtons_method(num, new_estimate)

Например, нам нужно найти квадратный корень 30-х годов. Мы знаем, что результат от 5 до 6.

newtons_method(30,5)

число равно 30, оценка - 5. Результат каждого рекурсивного вызова:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

Последний результат является наиболее точным вычислением квадратного корня числа. Это то же значение, что и встроенная функция math.sqrt ().

0 голосов
/ 06 апреля 2018

Возможно, простой способ запомнить: добавить точку после числителя (или знаменателя)

16 ** (1. / 2)   # 4
289 ** (1. / 2)  # 17
27 ** (1. / 3)   # 3
0 голосов
/ 25 июля 2017

Я надеюсь, что приведенный ниже код ответит на ваш вопрос.

def root(x,a):
    y = 1 / a
    y = float(y)
    print y
    z = x ** y
    print z

base = input("Please input the base value:")
power = float(input("Please input the root value:"))


root(base,power) 
0 голосов
/ 10 февраля 2017

Вы можете использовать NumPy для вычисления квадратных корней массивов:

 import numpy as np
 np.sqrt([1, 4, 9])
...