数字拒绝分割

2024-09-30 16:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个简单的函数叫“近似”,它把两个数相乘,然后除以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

Tags: 函数代码ifstepmathrootfloatlow
2条回答

在我看来,它肯定是被二除,只是被二除并不能使两个大数相乘。例如,假设您想找到10的平方根。trunk设置为11Approx(root, trunk)10 * 11 / 2 = 55。这被设置为roottrunk成为旧的root10。现在有了5510,而不是1011。重复几次,你就会得到inf。多看看你试图实现的方法(是巴比伦方法吗?)看看你的程序和方法有什么不同。这很可能是你痛苦的根源,而不是缺乏分裂。你知道吗

你的函数是按照你描述的方式工作的,但是我不明白你在剩下的代码中是如何使用它的。你知道吗

你似乎在尝试用牛顿法的一个变种来近似平方根,但很难理解你是如何实现它的。代码中的一些变量没有被使用(什么是temptrunk?),很难确定这是故意的还是错误的。你知道吗

如果它确实是您想要实现的牛顿法,那么您需要一个收敛到目标值的近似函数。为了做到这一点,你要计算一个猜测的算术平均数,然后用你的目标值除以这个猜测(new_guess = mean([old_guess, target/old_guess]))。一旦你有了它,你只需要比较new_guesstarget之间的差异,一旦它达到一个给定的阈值(在你的代码中,vague),你就可以中断循环了。你知道吗

有多种方法可以改进代码的其他方面:

  • 我建议不要使用sentinel值来打破循环,break语句更显式。你知道吗
  • 您可以直接使循环具有最大的步数,使用:

    for step in range(MAX_STEPS):
        guess = ... # try to guess
        if abs(target - guess) < delta:
            break
    else:
        print("Maximum steps reached.")
    

    只有当break未达到时,才会调用else块。

相关问题 更多 >