而block不按预期循环

时间:2013-05-02 00:25:00

标签: python loops

def fvals_sqrt(x):
    """
    Return f(x) and f'(x) for applying Newton to find a square root.
    """
    f = x**2 - 4.
    fp = 2.*x
    return f, fp

def solve(fvals_sqrt, x0, debug_solve = False):
    """
    Solves the sqrt function, using newtons methon.
    """
    iters = 0
    f, fp = 0.
    while  f > 10**-14 | -f < 10**-14:
        f, fp = fvals_sqrt(x0)
        x0 = x0 - (f/fp)
        iters = iters+1
        print  + " x = %22.15e in %i iterations " % (x0, iters)
        return x0, iters

    print "we're done"

我想要这个循环一次f一次小于10 ^ -14,但我不知道如何修改参数使循环迭代,任何帮助?

3 个答案:

答案 0 :(得分:4)

您需要逻辑or而不是|

while  f > 10**-14 or -f < 10**-14:

请注意,逻辑或(or)与按位或(|)之间的运算符优先级存在差异。您之前的陈述可能被解析为:

while (f > (10**-14 | -f)) < 10**-14):

这似乎会引发TypeError ...

写作可能更容易:

while abs(f) > 10**-14:

答案 1 :(得分:2)

|运算符用于bitwise-OR,因此您应该在此处使用逻辑or,其次return语句也位于错误的位置,它将结束您的循环只在一次迭代之后。

def solve(fvals_sqrt, x0, debug_solve = False):
    iters = 0
    f, fp = 0.
    while  f > 10**-14 or -f < 10**-14:
        f, fp = fvals_sqrt(x0)
        x0 = x0 - (f/fp)
        iters = iters+1
        print  + " x = %22.15e in %i iterations " % (x0, iters)
    print "we're done"
    return x0, iters

答案 2 :(得分:2)

while f > 10**-14 | -f < 10**-14使用的是按位OR,而不是逻辑OR。使用or关键字:

while  f > 10**-14 or -f < 10**-14:

此外,您return循环内的while。你必须将这一行放在一个缩进级别:

    return x0, iters