使用二分法计算平方根

时间:2016-05-28 10:11:51

标签: python

我有以下代码,应该使用二分法找到平方根,但由于某种原因,它不会。当我想找到9的平方根时,我得到4.5。

y = float(input('Enter the number that you want to find the square root of: '))
z = y
x = 0
ans = 0

while abs(ans**2 - abs(y)) > 0.0001 and ans <= x:
    ans = (x + y) / 2.0

    if ans**2 < z:
        x = ans
    else:
        y = ans


print 'The square root of', z, 'is', ans

3 个答案:

答案 0 :(得分:1)

您需要检查是否ans <= y,因为y在这种情况下是您的右边框。您还需要将ans**2z的绝对值进行比较,而不是y,因为您正在循环中更改y

while abs(ans**2 - abs(z)) > 0.00001 and ans <= y:   
    ans = (x + y) / 2.0

    if ans**2 < z:
        x = ans
    else:
        y = ans

答案 1 :(得分:0)

数字x的平方根:sqrt=x**(1.0/2)

替代方案:

import math
math.sqrt(x)

使用二分法算法:

y = float(input('Enter the number that you want to find the square root of: '))
num = y
x = 0
ans = 0

while abs(ans**2 - abs(num)) > 0.0001 and ans <= y:
    ans = (x + y) / 2.0
    if ans**2 < num:
        x = ans
    else:
        y = ans

print 'The square root of', num, 'is', ans

答案 2 :(得分:0)

Keiwan已经解释了你的脚本出了什么问题,但是这里组织逻辑的方式略有不同。我已经改变了一些变量名来使代码更具可读性,并且我将它放入一个函数中以使其更易于使用。下面的代码适用于Python 2或Python 3,尽管浮点数的打印方式存在细微差别。

from __future__ import print_function, division

def sqrt_bisect(z, tol=1E-12):
    ''' Find the square root of `z` by bisection, with tolerance `tol` '''
    lo, hi = 0, z
    while True:
        mid = (lo + hi) / 2.0
        delta = mid * mid - z
        if abs(delta) < tol:
            break

        if delta > 0:
            #Too high
            hi = mid
        else:
            #Too low
            lo = mid

    return mid

for z in (1, 9, 16, 200):
    x = sqrt_bisect(z)
    print(z, x, x*x)

<强>输出

1 1.0 0.999999999999
9 3.0 9.0
16 4.0 16.0
200 14.1421356237 200.0

(该输出是使用Python 2创建的)。

只是为了好玩,这是一个更紧凑的功能变体。

此版本使用名为lo的列表,而不是使用单独的hibounds变量来存储我们正在等分的区间的边界。语句bounds[delta > 0] = mid有效,因为False在数值上等于零,True等于1。因此,当delta为正时,bounds[delta > 0]相当于bounds[1]。这是一个聪明的伎俩,但如果你不习惯这种结构, 会使代码变得有点棘手。

def sqrt_bisect(z, tol=1E-12):
    ''' Find the square root of `z` by bisection, with tolerance `tol` '''
    bounds = [0, z]
    while True:
        mid = sum(bounds) / 2.0
        delta = mid * mid - z
        if abs(delta) < tol:
            break
        bounds[delta > 0] = mid

    return mid