i am in need of help with this homework. The instructions are as followed: Package Newton's method for approximating square roots in a function named newton. This function expects the input number as an argument and returns the estimate of its square root. The script should also include a main function that allows the user to compute the square roots of inputs until the user presses the enter/return key. This is what I have so far:

import math

#Initialize tolerance
tolerance = 0.000001

def newton(x):
    """ Returns the square root of x """
    #Performs the successive approximations
    estimate = 1.0
    while True:
        estimate = (estimate + x / estimate) / 2
        difference = abs(x - estimate ** 2)
        if difference <= tolerance:     # Break out of loop if difference is less than tolerance
            break           
        return estimate     # While the difference value is > TOLERANCE, the process continues



def main():
    """Allows the user to obtain square roots."""
    while True:
        #Receive the input number from the user
        x = input("Enter a positive number or enter/return to quit: ")
        if x == "":     #if user presses "Enter" then exit the program
            break       # Otherwise, continue the process of allowing new numbers
        x = float(x)
        #Output the result
        print("The programs estimate of the square root of ", x, "is ", round(newton(x),2))
        print("Python's estimate: ", math.sqrt(x))
main()

I tested it out, but it seems like the calculation is not accurate, can anyone help me?

Recommended Answers

All 5 Replies

return should be in place of break, I think. Also rounding to 2 decimals does not make sense after so small tolerance for error, generally you also do not round, you just format the printing.

line 15
return estimate
should be outside the loop

I would write the code like this ...

def newton_approx(x):
    """
    Newton's method to get the square root of x
    using successive approximations 
    """
    tolerance = 0.000001
    estimate = 1.0
    while True:
        estimate = (estimate + x / estimate) / 2
        difference = abs(x - estimate ** 2)
        if difference <= tolerance:
            break           
    return estimate

# test
x = 2
print("newton = %0.15f" % newton_approx(x))
print("x**0.5 = %0.15f" % (x**0.5))

'''
newton = 1.414213562374690
x**0.5 = 1.414213562373095
'''

Thank you everyone for your helpful inputs in solving my problem. The code now works since I moved the return outside of the loop. Now for phase 2 of my homework converting the current function to a recursive function. Any suggestions?

I would add parameter for current difference and return value from function which reaches the level of tolerance (which also could be a parameter).

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.