def root_finder(a, b, tol, f): """ a, b are real numbers, a < b. tol > 0, f is a real-valued continuous function defined on [a,b] that changes sign.""" while b - a > 2*tol: m = (a + b)/2.0 print(a, b, m) if f(a)*f(m) < 0: b = m elif f(m)*f(b) < 0: a = m else: return m return m print(root_finder(1, 2, .0001, lambda x:x*x - 2)) print(2**(.5)) print(root_finder(4, 5, .0001, lambda x:x**3 - 100))