# -*- coding: utf-8 -*-
"""Created on Wed Aug 2 20:22:25 2017@author: liuzimu"""
"""https://www.zhihu.com/question/35133069@Haojun"""
"""binary method, n is positive integer"""
def binary_method(n, threshold):
left, right = 0, n
while 1:
mid = (left + right) / 2
sqr = mid ** 2
if abs(sqr - n) <= threshold:
break
elif sqr > n:
right = mid
else:
left = mid
return mid
"""newton method, n is positive integerTheory:slope of the tangent line is f'(Xn)[Xn, f(Xn)] is one point of the tangent linef(Xn) - 0 = f'(Xn) * (Xn - Xn+1)Xn+1 = Xn - f(Xn) / f'(Xn)f(x) = x ** 2 - nf'(x) = 2 * xXn+1 = Xn - (Xn - n / Xn) / 2Xn+1 = (Xn + n / Xn) / 2"""
def newton_method(n, threshold):
res = n
while abs(res ** 2 - n) > threshold:
res = (res + n / res) / 2
return res
print("%.3f"%binary_method(2, 10e-5))
print("%.3f"%newton_method(2, 10e-5))
%timeit binary_method(2, 10e-5)
%timeit newton_method(2, 10e-5)