我正在从Guttag的书中编写一个程序,专门改变第33页的代码来处理负数。该程序试图通过使用二分搜索来找到数字的平方根。
我的问题简而言之:
>>> print(ans)
-12.0
>>> print(ans**2)
144.0
>>> print(-12**2)
-144
>>> -12.0**2
-144.0
将一个数字(在这种情况下为-12)平方给出了我在将IDLE作为数字输入时所期望的正确答案。然而,当它来自一个变量时,它突然转为正面。知道为什么会这样,以及如何解决它?
我的问题在较长的版本中,以防我也理解其他错误:
x = float(input("Enter an integer, which square root you want to find: "))
epsilon = 0.01
numGuesses = 0
low = min(0.0, x)
high = max(1.0, x)
ans = (high + low)/2.0
while abs(ans**2 - x) >= epsilon:
print("low =", low, "high =", high, "ans =", ans)
numGuesses += 1
if (ans**2) < x:
low = ans
else:
high = ans
ans = (high + low)/2.0
print("Number of guesses =", numGuesses)
print(ans, "is close to square root of", x)
因此,while循环决定是将变量ans分配给高还是低,如果从头开始使用负数,则不能这样做。例如,如果我使用x = -25运行此程序,它将打印出以下内容:
Enter an integer, which square root you want to find: -25
low = -25.0 high = 1.0 ans = -12.0
low = -25.0 high = -12.0 ans = -18.5
虽然ans(-12)的平方应该是-144,这会将其分配给“低”而不是高,并使程序工作。
所有建议都表示赞赏。
答案 0 :(得分:1)
当您评估-12**2
时,您实际上正在评估-(12**2)
。
而且,( - 12)平方总是144。
如果您想使用-(12**2)
保留标志。如果您不希望保留该代码,请使用(-12)**2
如果您正在尝试评估负数的平方根。它将与正数的sqrt乘以虚数i
只需像对正数一样评估负数,然后将i追加到它。
在您的特定情况下,当您评估负数时,min
功能会搞砸了