Python 负平方根的二分法
我有一个正整数平方根的对分循环。当尝试负平方根时,它会陷入无限循环。我已经把它缩小到将ans设置为-12,然后将其平方,但我不知道如何修复循环,使其保持在。任何帮助都将不胜感激 有关守则如下:Python 负平方根的二分法,python,infinite-loop,Python,Infinite Loop,我有一个正整数平方根的对分循环。当尝试负平方根时,它会陷入无限循环。我已经把它缩小到将ans设置为-12,然后将其平方,但我不知道如何修复循环,使其保持在。任何帮助都将不胜感激 有关守则如下: x = -25 epsilon = 0.01 numGuesses = 0 low = 1.0 high = x ans = (high + low)/2.0 if x >= 1.0: while abs(ans**2 - x) >= epsilon: print("l
x = -25
epsilon = 0.01
numGuesses = 0
low = 1.0
high = x
ans = (high + low)/2.0
if x >= 1.0:
while abs(ans**2 - x) >= epsilon:
print("low = " + str(low) + " high + " + str(high) + " ans = " + str(ans))
numGuesses += 1
if ans**2 < x:
low = ans
else:
high = ans
ans = (high + low)/2.0
else:
while abs(ans**2 - x) >= epsilon:
print("low = " + str(low) + " high + " + str(high) + " ans = " + str(ans))
numGuesses += 1
if abs(ans**2) < x:
low = ans
else:
high = ans
ans = (high + low)/2.0
print("numGuesses = " + str(numGuesses))
print(str(ans) + " is close to square root of " + str(x))
x=-25
ε=0.01
数值=0
低=1.0
高=x
ans=(高+低)/2.0
如果x>=1.0:
而abs(ans**2-x)>=ε:
打印(“低=”+str(低)+“高+”+str(高)+“ans=”+str(ans))
数值+=1
如果ans**2=ε:
打印(“低=”+str(低)+“高+”+str(高)+“ans=”+str(ans))
数值+=1
如果abs(ans**2)
最简单的方法是设置一个符号
标志:将x
翻转为正数,设置sign=False
,然后找到+25的sqrt。当你收敛时,检查符号:如果它是假的,那么你的值是虚的
您当前的代码正试图收敛到一个实根,而对于负数来说,这永远不会起作用。最简单的方法是设置一个
符号标志:将x
翻转为正数,设置符号=False
,然后找到+25的sqrt。当你收敛时,检查符号:如果它是假的,那么你的值是虚的
您当前的代码正试图收敛到一个真正的根,而对于负数,这是行不通的。多亏了Prune,我最终得到的答案如下:
x = -25
if x < 0:
flag = False
else:
flag = True
if flag is False:
x = abs(x)
epsilon = 0.01
numGuesses = 0
low = 1.0
high = x
ans = (high + low)/2.0
if x >= 1.0:
while abs(ans**2 - x) >= epsilon:
print("low = " + str(low) + " high + " + str(high) + " ans = " + str(ans))
numGuesses += 1
if ans**2 < x:
low = ans
else:
high = ans
ans = (high + low)/2.0
if flag is False:
ans = -ans
x = -x
print("numGuesses = " + str(numGuesses))
print(str(ans) + " is close to square root of " + str(x))
x=-25
如果x<0:
flag=False
其他:
flag=True
如果标志为False:
x=绝对值(x)
ε=0.01
数值=0
低=1.0
高=x
ans=(高+低)/2.0
如果x>=1.0:
而abs(ans**2-x)>=ε:
打印(“低=”+str(低)+“高+”+str(高)+“ans=”+str(ans))
数值+=1
如果ans**2
多亏了Prune,我得到的答案如下:
x = -25
if x < 0:
flag = False
else:
flag = True
if flag is False:
x = abs(x)
epsilon = 0.01
numGuesses = 0
low = 1.0
high = x
ans = (high + low)/2.0
if x >= 1.0:
while abs(ans**2 - x) >= epsilon:
print("low = " + str(low) + " high + " + str(high) + " ans = " + str(ans))
numGuesses += 1
if ans**2 < x:
low = ans
else:
high = ans
ans = (high + low)/2.0
if flag is False:
ans = -ans
x = -x
print("numGuesses = " + str(numGuesses))
print(str(ans) + " is close to square root of " + str(x))
x=-25
如果x<0:
flag=False
其他:
flag=True
如果标志为False:
x=绝对值(x)
ε=0.01
数值=0
低=1.0
高=x
ans=(高+低)/2.0
如果x>=1.0:
而abs(ans**2-x)>=ε:
打印(“低=”+str(低)+“高+”+str(高)+“ans=”+str(ans))
数值+=1
如果ans**2
x=-37
ε=0.01
num_guess=0
低=0.0
高=绝对值(x)
ans=((低+高)/2.0)
而abs(ans**3-abs(x))>=ε:
#打印(“低=”+str(低)+“高”+str(高)+“ans=”+str(ans))
如果ans**3
也许您可以在代码中输入的所有x中打印abs()
ε=0.01
num_guess=0
低=0.0
高=绝对值(x)
ans=((低+高)/2.0)
而abs(ans**3-abs(x))>=ε:
#打印(“低=”+str(低)+“高”+str(高)+“ans=”+str(ans))
如果ans**3
也许您可以在代码中输入的所有x中打印abs()您的问题是如何修复循环,使其保持在?简单的答案是:你没有
解决这个问题的方法部分是数学设计,部分是软件设计
从数学上讲,你不能计算一个负数的平方根而得到一个实数。有两种可能的解决方案:
切换到复数。但我怀疑你的二分法是否能奏效
当您不需要复数或您的问题域无法理解复杂结果时,请不要对负数进行计算。
您应该永远不要编写代码,生成负数的结果。当然,从算法上来说,你可以这样做,正如几个答案,包括你自己的答案所显示的那样。但是这是一个非常糟糕的想法,因为下面的软件设计考虑因素
您的代码将是一个更大的软件的一部分,并且将有一些其他代码调用您的函数。数学在这里给了你一个提示:用负数调用函数是调用方的一个错误。但是,由于您的函数将返回一些(数学上无用的)结果,您的软件项目中的此类错误可能会在很长一段时间内被发现。但总有一天,它会产生丑陋的失败,温暖而舒适地隐藏在你创造的迷雾中,让你很难找到它
好的,很抱歉,解决方案是:在使用负参数调用函数时引发异常 你的问题是如何修复循环,使其保持在循环中?简单的答案是