如何在Python中计算平方根?

Mer*_*lin 123 python math sqrt

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

x = 16

sqrt = x**(.5)
returns 4

sqrt = x**(1/2)
returns 1
Run Code Online (Sandbox Code Playgroud)

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

sme*_*ing 225

sqrt=x**(1/2)正在进行整数除法.1/2 == 0.

所以你在第一个实例中计算x (1/2),在第二个实例中计算x (0).

所以这没有错,这是对不同问题的正确答案.

  • "所以没有错,这是对不同问题的正确答案" - 喜欢它! - 想想我可能会挑战自己更频繁地使用这句话! (58认同)
  • 在Python 3.6中,您可以得到您第一次提出的问题的正确答案. (5认同)
  • 第二种方法可以计算为:`sqrt = x **(float(1)/ 2)` (2认同)

Ósc*_*pez 103

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

这种行为在Python 2.x中是"正常的",而在Python 3.x中1/2评估为0.5.如果你希望你的Python 2.x代码表现得像3.x wrt division write from __future__ import division- 那么1/2将评估为0.5和向后兼容,1//2eill评估0.

而对于记录,计算平方根的首选方法是:

import math
math.sqrt(x)
Run Code Online (Sandbox Code Playgroud)


whi*_*rer 22

import math
math.sqrt( x )
Run Code Online (Sandbox Code Playgroud)

这是答案链的一个微不足道的补充.然而,由于主题是非常常见的谷歌搜索,我相信这值得添加.


Nik*_* B. 10

/ 在Python 2中执行整数除法:

>>> 1/2
0
Run Code Online (Sandbox Code Playgroud)

如果其中一个数字是浮点数,它按预期工作:

>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0
Run Code Online (Sandbox Code Playgroud)


gfo*_*une 7

你所看到的是整数除法.要默认获得浮点除法,

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

或者,您可以将1或2的1/2转换为浮点值.

sqrt = x**(1.0/2)
Run Code Online (Sandbox Code Playgroud)


gun*_*tan 6

这可能有点晚了,但计算平方根的最简单和准确的方法是牛顿法。

你有一个数字,你想计算它的平方根(num),你有一个对它的平方根的猜测(estimate)。Estimate 可以是任何大于 0 的数字,但有意义的数字会显着缩短递归调用深度。

new_estimate = (estimate + num / estimate) / 2
Run Code Online (Sandbox Code Playgroud)

这条线使用这两个参数计算更准确的估计。您可以将 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)
Run Code Online (Sandbox Code Playgroud)

例如,我们需要找到 30 的平方根。我们知道结果在 5 到 6 之间。

newtons_method(30,5)
Run Code Online (Sandbox Code Playgroud)

number 是 30,估计是 5。每个递归调用的结果是:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661
Run Code Online (Sandbox Code Playgroud)

最后的结果是最准确的数字平方根计算。它与内置函数 math.sqrt() 的值相同。