Search code examples
pythonbisection

Calculating square root of 2


Why does the following code does not terminate?

# approximating sqrt(2)

def approx (error,left, right):
    c = (left+right)/2
    f = c**2 - 2

    if abs(f)<error :
        return c

    if f < 0:
        left = c
    else:
        right = c

    return approx(error,left,right)

print approx(0.1,0,2)

Solution

  • You might be losing precision on this line:

    c = (left+right)/2
    

    if left and right are both integers, then c will also be an integer. This leads to unexpected behavior, for instance 1/2 evaluating to 0.

    You can force the result to be a float by dividing by a float:

    c = (left+right)/2.0
    

    Or you can switch to Python 3.X and it will use ordinary sensible division automatically.