我做了一个名为"大约"它将两个数字相乘,然后将它们除以2。当我单独使用该功能时,它工作得很好,但似乎在代码的大块中我没有将数字分成两半,我不知道为什么。这是我的代码,错误在哪里,我该如何解决?
import math
def Approx(low,high):
base = low * high
return base/2
root = float(input("What to approx the sqrt of : "))
vague = float(input("How off can it be? : "))
wrong = True
oroot = root
root = math.floor(float(root))
trunk = root + 1
step = 0
while wrong:
if Approx(root,trunk) > oroot - vague and Approx(root,trunk) < oroot:
print("Done. " + str(step) + " steps taken.")
else:
if Approx(root,trunk) > oroot:
temproot = root
root = Approx(root,trunk)
trunk = temproot
step += 1
print("Step " + str(step) + " finished. Approx is " + str(Approx(root,trunk)))
else:
temptrunk = trunk
trunk = Approx(root,trunk)
root = trunk
step += 1
print("Step " + str(step) + " finished. Approx is " + str(Approx(root,trunk)))
if step > 50:
print("More than fifty steps required.")
wrong = False
答案 0 :(得分:1)
您的功能以您描述的方式工作,但我不明白您如何在其余代码中使用它。
您似乎正在尝试使用牛顿方法的变体来近似平方根,但很难理解您是如何实现它的。您的代码中的某些变量未被使用(temptrunk
是什么?),并且很难确定它是有意还是错误。
如果确实是你想要实现的牛顿方法,你需要有一个收敛到目标值的近似函数。为此,您计算猜测的算术平均值和目标值除以此猜测(new_guess = mean([old_guess, target/old_guess])
)。完成后,您只需要比较new_guess
和target
之间的差异,一旦达到给定的阈值(在代码vague
中),就可以打破循环
有多种方法可以改善代码的其他方面:
break
语句更明确。您可以直接使循环具有最大步数,使用:
for step in range(MAX_STEPS):
guess = ... # try to guess
if abs(target - guess) < delta:
break
else:
print("Maximum steps reached.")
只有else
break
块。
答案 1 :(得分:1)
在我看来,它绝对 除以2,只是除以2并不会将两个大数相乘。例如,假设您想要找到10
的平方根。 trunk
设置为11
。 Approx(root, trunk)
是10 * 11 / 2 = 55
。这设置为root
,trunk
变为旧root
,10
。现在,您有55
和10
而不是10
和11
。重复几次,最后得到inf
。更多地了解您尝试实施的方法(是巴比伦方法吗?)并查看您的程序和方法的不同之处。这可能是你的困境的根源,而不是缺乏分裂。