用牛顿法实现平方根函数

算法原理

牛顿法是通过选择一个起点 z 然后重复以下过程来求 Sqrt(x) 的近似值:

递推公式

z -= (z*z - x) / (2 * z)

迭代一定次数之后,z 的值就是 Sqrt(x) 的近似值

详细算法原理可以看:如何通俗易懂地讲解牛顿迭代法

Go 语言实现

第一种实现,迭代5次后停止循环

package main

import (
	"fmt"
	"math"
)

func Sqrt(x float64) float64 {
	z := 1.0
	for i := 0; i < 5; i++ {
		z -= (z*z - x) / (2 * z)
	}
	return z
}

func main() {
	n := 2.0
	fmt.Println(Sqrt(n))
	fmt.Println(math.Sqrt(n))
}

迭代5次的运行结果

1.4142135623730951
1.4142135623730951

迭代到前后值相差为 1e-6 时,停止迭代

package main

import (
	"fmt"
	"math"
)

const delta = 1e-6

func Sqrt(x float64) float64 {
	z := x
	n := 0.0
	for math.Abs(n-z) > delta {
		n, z = z, z-(z*z-x)/(2*z)
	}
	return z
}

func main() {
	const x = 2
	mine, theirs := Sqrt(x), math.Sqrt(x)
	fmt.Println(mine, theirs, mine-theirs)
}