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