我有一个正整数平方根的二分循环。当尝试负平方根时,它会陷入无限循环。我已将它缩小到将它设置为-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))
答案 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)
您的问题是如何解决循环问题,使问题得以解决?简单的答案是:您不。
解决此问题的方法部分是数学上的,部分是软件设计。
从数学上讲,您不能计算负数的平方根并不能得到实数。有两种可能的解决方案:
切换为复数。但是我怀疑您的二等分算法是否可以正常工作。
当您不需要复数或问题域无法理解复杂的结果时,请勿对负数进行计算。
您从不应该做的是编写会产生负数结果的代码。当然,按照算法,您可以这样做,因为包括您自己在内的几个答案都会显示出来。但是,出于以下软件设计考虑,这是一个非常糟糕的主意。
您的代码将成为更大软件的一部分,并且还会有一些其他代码将调用您的函数。数学在这里给您一个提示:用负数调用函数是调用方的错误。但是由于您的函数将返回 some (在数学上是无用的)结果,因此您的软件项目中的此类错误可能会长期存在。但是总有一天,它会产生丑陋的故障,温暖而舒适地隐藏在您创建的薄雾中,使查找它非常困难。
好的,很抱歉,解决方法是:使用负参数调用函数时引发异常。