Почему Python дает «неправильный» ответ?
x = 16
sqrt = x**(.5) #returns 4
sqrt = x**(1/2) #returns 1
Да знаю import math
и пользуюсь sqrt
. Но я ищу ответ на вышесказанное.
Почему Python дает «неправильный» ответ?
x = 16
sqrt = x**(.5) #returns 4
sqrt = x**(1/2) #returns 1
Да знаю import math
и пользуюсь sqrt
. Но я ищу ответ на вышесказанное.
import math
а затем x = math.sqrt(25)
присвоите значение 5.0
x.
Ответы:
sqrt=x**(1/2)
делает целочисленное деление. 1/2 == 0
.
Итак, вы вычисляете x (1/2) в первом случае, x (0) во втором.
Так что это не неправильно, это правильный ответ на другой вопрос.
sqrt = x**(float(1)/2)
Вы должны написать:, 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)
Возможно, ответить на этот вопрос немного поздно, но самый простой и точный способ вычисления квадратного корня - это метод Ньютона.
У вас есть число, квадратный корень которого вы хотите вычислить, (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 ().
Вы можете использовать NumPy для вычисления квадратных корней массивов:
import numpy as np
np.sqrt([1, 4, 9])
Если вы хотите сделать это так, как это делает калькулятор, воспользуйтесь вавилонской техникой. Это объясняется здесь и здесь .
Предположим, вы хотите вычислить квадратный корень из 2:
a=2
a1 = (a/2)+1
b1 = a/a1
aminus1 = a1
bminus1 = b1
while (aminus1-bminus1 > 0):
an = 0.5 * (aminus1 + bminus1)
bn = a / an
aminus1 = an
bminus1 = bn
print(an,bn,an-bn)
Надеюсь, приведенный ниже код ответит на ваш вопрос.
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)