Python 负平方根的二分法

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

我有一个正整数平方根的对分循环。当尝试负平方根时,它会陷入无限循环。我已经把它缩小到将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("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()您的问题是如何修复循环,使其保持在?简单的答案是:你没有

解决这个问题的方法部分是数学设计,部分是软件设计

从数学上讲,你不能计算一个负数的平方根而得到一个实数。有两种可能的解决方案:

  • 切换到复数。但我怀疑你的二分法是否能奏效

  • 当您不需要复数或您的问题域无法理解复杂结果时,请不要对负数进行计算。

  • 您应该永远不要编写代码,生成负数的结果。当然,从算法上来说,你可以这样做,正如几个答案,包括你自己的答案所显示的那样。但是这是一个非常糟糕的想法,因为下面的软件设计考虑因素

    您的代码将是一个更大的软件的一部分,并且将有一些其他代码调用您的函数。数学在这里给了你一个提示:用负数调用函数是调用方的一个错误。但是,由于您的函数将返回一些(数学上无用的)结果,您的软件项目中的此类错误可能会在很长一段时间内被发现。但总有一天,它会产生丑陋的失败,温暖而舒适地隐藏在你创造的迷雾中,让你很难找到它

    好的,很抱歉,解决方案是:在使用负参数调用函数时引发异常

    你的问题是如何修复循环,使其保持在循环中?简单的答案是