负平方根的二分算法

时间:2017-06-15 22:18:28

标签: python infinite-loop

我有一个正整数平方根的二分循环。当尝试负平方根时,它会陷入无限循环。我已将它缩小到将它设置为-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))

4 个答案:

答案 0 :(得分:1)

最简单的方法是设置sign标记:将x翻转为正数,设置sign = False,然后找到+25的sqrt。如果你收敛,请检查sign:如果它是False,那么你的值就是虚数。

您当前的代码正在尝试收敛到真正的根目录,并且从不将用于负数。

答案 1 :(得分:1)

由于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))

答案 2 :(得分:0)

x = -37
epsilon = 0.01
num_guess = 0
low = 0.0
high = abs(x)

ans = ((low + high)/2.0)

while abs(ans**3-abs(x)) >= epsilon:
    #print("low = " + str(low) + " high " + str(high) + " ans = " + str(ans))
    if ans**3 < abs(x):
        low = ans
    else :
        high = ans
    ans = ((low + high)/2.0)
    num_guess += 1 

if x < 0:
    ans = -ans
print("Steps taken during bisecction search: ",num_guess)
print("The cube root of " + str(x) + " is " + str(ans))

也许您可以只在代码中输入的所有x中打印abs()

答案 3 :(得分:0)

您的问题是如何解决循环问题,使问题得以解决?简单的答案是:您不

解决此问题的方法部分是数学上的,部分是软件设计。

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

  1. 切换为复数。但是我怀疑您的二等分算法是否可以正常工作。

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

从不应该做的是编写会产生负数结果的代码。当然,按照算法,您可以这样做,因为包括您自己在内的几个答案都会显示出来。但是,出于以下软件设计考虑,这是一个非常糟糕的主意。

您的代码将成为更大软件的一部分,并且还会有一些其他代码将调用您的函数。数学在这里给您一个提示:用负数调用函数是调用方的错误。但是由于您的函数将返回 some (在数学上是无用的)结果,因此您的软件项目中的此类错误可能会长期存在。但是总有一天,它会产生丑陋的故障,温暖而舒适地隐藏在您创建的薄雾中,使查找它非常困难。

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