Почему 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**(float(1)/2)
- person VM_AI; 28.09.2018
Вы должны написать: sqrt = x**(1/2.0)
, иначе выполняется целочисленное деление и выражение 1/2
возвращает 0
.
Такое поведение является «нормальным» в Python 2.x, тогда как в Python 3.x 1/2
оценивается как 0.5
. Если вы хотите, чтобы ваш код Python 2.x вел себя как код 3.x w.r.t. деление пишет 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)
Это может быть немного поздно, чтобы ответить, но самый простой и точный способ вычислить квадратный корень - это метод Ньютона.
У вас есть число, для которого вы хотите вычислить квадратный корень (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
Если вы хотите сделать это так, как это делает калькулятор, используйте вавилонскую технику. Это объясняется здесь и здесь.
Предположим, вы хотите вычислить квадратный корень из 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)
Вы можете использовать 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)
import math
, а затемx = math.sqrt(25)
, который присвоит значение5.0
x. - person Eric Leschinski   schedule 06.02.2016