问题背景
给定任意一个数x,求其平方根z,平方误差小于0.001。
这个问题直观的去想,我们一般会采取设定一个初始值,然后通过迭代逐渐逼近平方根,但是初始值怎样去迭代才能更快”逼近“成为关键问题,牛顿迭代公式从数学角度给这类问题提供了理论支撑。
Newton迭代公式
对于Newton公式的理论,我们引用百度百科的说明
代码实现
理解了牛顿迭代公式,其实结论就是,这个也是迭代“逼近”的算法。对于我们求平方根的需求,
,迭代算法就是:z = z - (z*z - x)/(2*z),但是到底迭代多少次需要我们自己控制,可以控制迭代次数或者达到一定精度后停止迭代。下面给出go的实现:
/*
Newton's method to compute the square root most nearly.
*/
func Sqrt(x float64) float64 {
fmt.Println("**********Test - get the square root*********")
z := float64(1)
for i := 0; math.Abs(z*z - x) > 0.001; i++ {
z -= (z*z - x) / (2*z)
fmt.Println("iterator order: ", i, ", x: ", z)
}
return z
}
以200作为输入的结果:
**********Test - get the square root*********
iterator order: 0 , x: 100.5
iterator order: 1 , x: 51.245024875621894
iterator order: 2 , x: 27.573921384195742
iterator order: 3 , x: 17.41357580449592
iterator order: 4 , x: 14.44943381958916
iterator order: 5 , x: 14.145403301286928
iterator order: 6 , x: 14.142136001158033
14.142136001158033