Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的平方根算法_Python_While Loop - Fatal编程技术网

python中的平方根算法

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) 你不应该使用=或==运算符来比较浮点变量,因为这样一个简单的算法不太可能精确到平方根。相反,您应该定义您愿意容忍的可接受错误,并继续,直到您达到一个错误小于该错误的数字。然而,

我在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
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
。谢谢,我现在用它代替了。