如何在Python中计算平方根?


140

为什么Python会给出“错误”的答案?

x = 16

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

是的,我知道import math并使用sqrt。但我正在寻找以上答案。


31
在Python 3中尝试一下,它已修复;)
Mark Ransom 2012年

2
使用来计算python中的平方根,import math然后x = math.sqrt(25)将其赋值5.0给x。
埃里克·莱斯钦斯基

1
@Merlin-请不要回滚对标题的更改。它使问题更容易找到。
克里斯·

2
@ChrisF-我的问题是解决多个问题。停止更改标题和内容。
Merlin

Answers:


246

sqrt=x**(1/2)在做整数除法。1/2 == 0

因此,您在第一个实例中计算x (1/2),在第二个实例中计算x (0)

没错,这是对其他问题的正确答案。


64
“所以这没错,这是对其他问题的正确答案”-喜欢它!-认为我可能会挑战自己以更频繁地使用此短语!
Thomas Kimber

6
在Python 3.6中,您可以正确回答最初提出的问题。
vwvan'4

2
第二种方法可以计算为:sqrt = x**(float(1)/2)
VM_AI '18

117

您必须编写:sqrt = x**(1/2.0),否则将执行整数除法并1/2返回表达式0

此行为是在Python 2.x的“正常”,而在Python 3.x的1/2计算结果为0.5。如果您希望Python 2.x代码的行为类似于3.x wrt除法写入from __future__ import division-那么1/2将评估0.5为并向后兼容,1//2评估为0

作为记录,计算平方根的首选方法是:

import math
math.sqrt(x)

23
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
这是一种更自然的求平方根的方法,但是它如何回答问题(公认的是,它确实回答了标题中的问题,但没有回答正文中的实际问题(是的,这是一个不好的标题))?
彼得·莫滕森

-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.