我做了一个简单的函数叫“近似”,它把两个数相乘,然后除以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
在我看来,它肯定是被二除,只是被二除并不能使两个大数相乘。例如,假设您想找到
10
的平方根。trunk
设置为11
。Approx(root, trunk)
是10 * 11 / 2 = 55
。这被设置为root
,trunk
成为旧的root
,10
。现在有了55
和10
,而不是10
和11
。重复几次,你就会得到inf
。多看看你试图实现的方法(是巴比伦方法吗?)看看你的程序和方法有什么不同。这很可能是你痛苦的根源,而不是缺乏分裂。你知道吗你的函数是按照你描述的方式工作的,但是我不明白你在剩下的代码中是如何使用它的。你知道吗
你似乎在尝试用牛顿法的一个变种来近似平方根,但很难理解你是如何实现它的。代码中的一些变量没有被使用(什么是
temptrunk
?),很难确定这是故意的还是错误的。你知道吗如果它确实是您想要实现的牛顿法,那么您需要一个收敛到目标值的近似函数。为了做到这一点,你要计算一个猜测的算术平均数,然后用你的目标值除以这个猜测(
new_guess = mean([old_guess, target/old_guess])
)。一旦你有了它,你只需要比较new_guess
和target
之间的差异,一旦它达到一个给定的阈值(在你的代码中,vague
),你就可以中断循环了。你知道吗有多种方法可以改进代码的其他方面:
break
语句更显式。你知道吗您可以直接使循环具有最大的步数,使用:
只有当
break
未达到时,才会调用else
块。相关问题 更多 >
编程相关推荐