Почему Python дает "неправильный" ответ?
x = 16
sqrt = x**(.5)
returns 4
sqrt = x**(1/2)
returns 1
Да, я знаю import math
и использую sqrt
. Но я ищу ответ на вышеупомянутый вопрос.
Вы должны написать: sqrt = x**(1/2.0)
, иначе выполняется целочисленное деление и выражение 1/2
возвращает 0
.
Такое поведение "нормально" в Python 2.x, тогда как в Python 3.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)
/
выполняет целочисленное деление в Python 2:
>>> 1/2
0
Если одно из чисел является float, то все работает как ожидалось:
>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0
То, что вы видите, - это целочисленное деление. Чтобы получить деление с плавающей запятой по умолчанию,
from __future__ import division
Или вы можете преобразовать 1 или 2 из 1/2 в значение с плавающей точкой.
sqrt = x**(1.0/2)
Возможно, это немного запоздалый ответ, но самый простой и точный способ вычисления квадратного корня - это метод Ньютона.
У вас есть число, квадратный корень которого вы хотите вычислить (num)
, и у вас есть предположение о его квадратном корне (estimate)
. Estimate может быть любым числом больше 0, но число, которое имеет смысл, значительно сокращает глубину рекурсивного вызова.
new_estimate = (estimate + num / estimate) / 2
Эта строка вычисляет более точную оценку с этими 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().
Возможно, простой способ запомнить: добавьте точку после числителя (или знаменателя)
16 ** (1. / 2) # 4
289 ** (1. / 2) # 17
27 ** (1. / 3) # 3
Надеюсь, приведенный ниже код ответит на ваш вопрос.
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)
Вы можете использовать NumPy для вычисления квадратных корней из массивов:
import numpy as np
np.sqrt([1, 4, 9])