需求:在不借助系统库的情况下,编写一个函数,实现开根号的操作,并且保证一定的精度
代码采用了牛顿迭代法以及二分查找法两种方式并分别打印了他们的循环次数以比较优劣:
/**
* 实现一个函数,完成对v开根号的操作,误差小于t,不能调用函数库
*/
public class Sqrt{
/**
* 可以使用牛顿迭代法
* 首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了
*/
public static double iter(int v,double t){
int i = 0;
// 首先预估一个数
double random = v >> 1;
while(abs((v-random*random)) > t){
random = (random + v/random) >> 1;
i++;
}
System.out.println("开根号值: "+random+" ,循环次数: "+i);
return random;
}
// 二分查找法
public static double binarySearch(int v,double t){
int i = 0;
double max = v;
double min = 0;
double temp = v >> 1;
while (abs(temp*temp-v) > t){
if (temp*temp > v ){
max = temp;
} else if(temp*temp < v){
min = temp;
}
temp = (min+max) >> 1;
i++;
}
System.out.println("开根号值: "+temp+" ,循环次数: "+i);
return temp;
}
public static double abs(double a){
return (a <= 0.0D) ? 0.0D - a : a ;
}
public static void main(String[] args) {
iter(100,0.1);
System.out.println("-----------------");
binarySearch(100,0.1);
}
}
结果如下:
开根号值: 31.638589750191308 ,循环次数: 7
-----------------
开根号值: 31.63909912109375 ,循环次数: 16
牛顿迭代法相比较二分查找法效率更高