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).
所以这没有错,这是对不同问题的正确答案.
Ó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)
你所看到的是整数除法.要默认获得浮点除法,
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)
这可能有点晚了,但计算平方根的最简单和准确的方法是牛顿法。
你有一个数字,你想计算它的平方根(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() 的值相同。