在《算法》一书中看到一个用“牛顿迭代法”求平方根的算法,当时就一脸懵逼,压根看不懂啊。
百度了下“牛顿迭代法”,尼玛压根看不懂,内容中涉及到的曲线方程求导函数,以及求切线方程的知识都还给高中老师了,不看懂我心里难受,于是硬着头皮恶补相关知识。
很多朋友把相关的知识写得很详细,关键在于理解平方根与牛顿迭代法的关系,这里不详细描述,只贴代码。
/**
* 牛顿迭代法
* @param num float 需要求平方根的数字
* @param e float 要求最大误差不得超过e
* @return
*/
private static float sqrtNewton(float num, float e) {
float guess = num / 2;
float e0;
int count = 0;
do {
//牛顿迭代法用在这里了
//简化的写法:guess = (guess + num / guess) / 2;
guess = guess-(guess*guess-num)/(2*guess);
e0 = guess*guess - num;
count++;
System.out.println("第"+ count + "次计算:"+"guess="+guess+",误差="+e0);
} while (e0 > e);
System.out.println("经过"+count+"次计算,得到的结果为"+guess);
return guess;
}
来自《算法》一书的算法:
public static double sqrt(double c){
if(c<0)
return Double.NaN;
//猜测值
double t = c;
//误差
double err = 1e-15;
while(Math.abs(t-c/t) > err*t){
t = (c/t+t)/2.0;
}
return t;
}