python中的平方根算法
我在python中使用while循环完成这项工作。它没有终止python中的平方根算法,python,while-loop,Python,While Loop,我在python中使用while循环完成这项工作。它没有终止 x = 2.0 ans = 0 while ans**2 != abs(x): print (ans) ans = ans + 0.001 if ans**2 == abs(x): print(ans) 你不应该使用=或==运算符来比较浮点变量,因为这样一个简单的算法不太可能精确到平方根。相反,您应该定义您愿意容忍的可接受错误,并继续,直到您达到一个错误小于该错误的数字。然而,
x = 2.0
ans = 0
while ans**2 != abs(x):
print (ans)
ans = ans + 0.001
if ans**2 == abs(x):
print(ans)
你不应该使用
=
或==
运算符来比较浮点变量,因为这样一个简单的算法不太可能精确到平方根。相反,您应该定义您愿意容忍的可接受错误,并继续,直到您达到一个错误小于该错误的数字。然而,这样做可能不够。因为你有一个恒定的增量,你很可能会发现你永远不会接近你正在搜索的平方根,因此,需要一个额外的保护,以不通过所需的结果并继续无穷大:
x = 2.0
ans = 0
step = 0.001
delta = 0.0001
while ans**2 < x and abs (ans**2 - x) > delta:
ans = ans + step
# Done looping, found the best ans for ans**2<x.
# Check one additional value where ans**2>x
# and choose the one with the smaller delta
overAns = ans + step
if abs (overAns ** 2 - x) < abs (ans ** 2 - x):
print overAns
else:
print ans
x=2.0
ans=0
阶跃=0.001
增量=0.0001
当ans**2delta时:
ans=ans+步进
#完成循环,为ans**2x找到最佳ans
#然后选择一个三角形较小的
overAns=ans+步进
如果abs(覆盖**2-x)你不应该使用=
或==
运算符来比较浮点变量,因为这样一个简单的算法不太可能精确到平方根。相反,您应该定义您愿意容忍的可接受错误,并继续,直到您达到一个错误小于该错误的数字。然而,这样做可能不够。因为你有一个恒定的增量,你很可能会发现你永远不会接近你正在搜索的平方根,因此,需要一个额外的保护,以不通过所需的结果并继续无穷大:
x = 2.0
ans = 0
step = 0.001
delta = 0.0001
while ans**2 < x and abs (ans**2 - x) > delta:
ans = ans + step
# Done looping, found the best ans for ans**2<x.
# Check one additional value where ans**2>x
# and choose the one with the smaller delta
overAns = ans + step
if abs (overAns ** 2 - x) < abs (ans ** 2 - x):
print overAns
else:
print ans
x=2.0
ans=0
阶跃=0.001
增量=0.0001
当ans**2delta时:
ans=ans+步进
#完成循环,为ans**2x找到最佳ans
#然后选择一个三角形较小的
overAns=ans+步进
如果abs(覆盖**2-x)
即使这样也不能像您希望的那样工作:
>>> (2 ** 0.5) ** 2 == 2
False
但是,对于某些数字,即使是非正方形:
>>> (11 ** 0.5) ** 2 == 11
True
更简单的计算甚至可能出错:
>>> 0.1 + 0.2 == 0.3
False
问题是,一般来说,计算机不能准确地表示浮点数。你只能得到一个接近正确数字的数字。所以你不应该做一个精确性测试,而应该做一个接近性测试(检查差异是否小于某个小数字,小到足以满足你的需要)
abs((2**0.5)**2-2)<1e-10
真的
即使这样也不能像您希望的那样工作:
>>> (2 ** 0.5) ** 2 == 2
False
但是,对于某些数字,即使是非正方形:
>>> (11 ** 0.5) ** 2 == 11
True
更简单的计算甚至可能出错:
>>> 0.1 + 0.2 == 0.3
False
问题是,一般来说,计算机不能准确地表示浮点数。你只能得到一个接近正确数字的数字。所以你不应该做一个精确性测试,而应该做一个接近性测试(检查差异是否小于某个小数字,小到足以满足你的需要)
abs((2**0.5)**2-2)<1e-10
真的
这是因为ans
永远不等于sqrt(2)。事实上,没有一个浮点数等于sqrt(2),甚至连math.sqrt(2)
返回的数字都不等于。您不应该将浮点值与==
或进行比较=代码>运算符,使用公差:abs(ans**2-abs(x))>=0.0001
@Kevin:sqrt(2)在数学意义上与此无关。他是在比较浮点数。@Kevin他不是在比较sqrt(2)。你可能会对sqrt(11)说同样的话,但事实上,(11**0.5)**2==11
恰好是真的。这是因为ans
永远不等于sqrt(2)。事实上,没有一个浮点数等于sqrt(2),甚至连math.sqrt(2)
返回的数字都不等于。您不应该将浮点值与==
或进行比较=代码>运算符,使用公差:abs(ans**2-abs(x))>=0.0001
@Kevin:sqrt(2)在数学意义上与此无关。他是在比较浮点数。@Kevin他不是在比较sqrt(2)。你可能会对sqrt(11)说同样的话,但事实上,(11**0.5)**2==11
恰好是真的。你能说明一下这个算法有多糟糕,也许还能展示一个很好的实现,一个更有效的实现:)我很高兴看到你的快速回答,这是我在堆栈上的第一次。你能用点解释一下while命令吗?我对编程非常陌生。请帮助我我想掌握它。你的介绍有点吹毛求疵:他只是在测试他的数字平方是否等于2。因此,他的数字不必是2的平方根。你能说明一下这个算法有多糟糕,也许还能展示一个很好的实现——一个更有效的实现:)我很高兴看到你给出了一个非常快速的答案,这是我在堆栈上的第一次。你能用点解释一下while命令吗?我对编程非常陌生。请帮助我我想掌握它。你的介绍有点吹毛求疵:他只是在测试他的数字平方是否等于2。因此,他的数字不必是2的平方根。或者更简单的0.1+0.2==0.3
返回False
。谢谢,我现在用了它。或者更简单的0.1+0.2==0.3
返回False
。谢谢,我现在用它代替了。