Как вычислить квадратный корень в Python?


145

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

x = 16

sqrt = x**(.5)  #returns 4
sqrt = x**(1/2) #returns 1

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


32
Попробуйте в Python 3, это исправлено;)
Марк Рэнсом,

2
Вычислите квадратный корень в python с помощью, import mathа затем x = math.sqrt(25)присвоите значение 5.0x.
Эрик Лещински

1
@Merlin - пожалуйста, не откатывайте изменения заголовка. Так легче найти вопрос.
ChrisF

2
@ChrisF - это мой вопрос, касается множества проблем. Прекратите менять заголовок и содержание.
Merlin

Ответы:


251

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

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

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


67
«Так что это не неправильно, это правильный ответ на другой вопрос» - в восторге! - думаю, я мог бы заставить себя использовать эту фразу чаще!
Томас Кимбер,

7
в Python 3.6 вы получите правильный ответ на свой первый вопрос.
vwvan

2
Второй метод может быть вычислен как:sqrt = x**(float(1)/2)
VM_AI

119

Вы должны написать:, 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)

24
import math
math.sqrt( x )

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


11

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

>>> 1/2
0

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

>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0

7

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

from __future__ import division

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

sqrt = x**(1.0/2)

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 ().


1

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

16 ** (1. / 2)   # 4
289 ** (1. / 2)  # 17
27 ** (1. / 3)   # 3

0

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

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

1
Это более естественный способ получения квадратного корня, но как он отвечает на вопрос (по общему признанию, он отвечает на вопрос в заголовке, но не на фактический вопрос в теле (да, это плохой заголовок))?
Питер Мортенсен

0

Если вы хотите сделать это так, как это делает калькулятор, воспользуйтесь вавилонской техникой. Это объясняется здесь и здесь .

Предположим, вы хотите вычислить квадратный корень из 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)

-1

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

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) 

Пожалуйста , редактировать и добавлять краткое объяснение , почему это работает. Просто код не очень помогает.
wjandrea 04
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.