朋友说面试遇到这个问题,我上网上查了一下,基本就是两种方法
1.二分法不断尝试
网上找的代码没有考虑小于1大于0的情况,随便加上了,没有优化。
public static double sqrt(double t, Double precise) {
double low = 0, high = t, middle, squre,
prec = precise != null ? precise : 1e-5;
if ( t < 0 ) {
throw new RuntimeException("Negetive number cannot have a sqrt root.");
}else if(t>=1){
while ( high - low > prec ) {
middle = ( low + high ) / 2;
squre = middle * middle;
if ( squre > t ) {
high = middle;
} else {
low = middle;
}
}
return ( low + high ) / 2;
}else{
low = t;
high = 1;
while ( high - low > prec ) {
middle = ( high+low ) / 2;
squre = middle * middle;
if ( squre > t ) {
high = middle;
} else {
low = middle;
}
}
return ( high + low ) / 2 + squre;
}
}
2.牛顿迭代法
这个确实比别的方法效率高并且准确,一般5次循环就能很精确了,不过还是有一些数很极端的,所以还是用一个精度来判断。
public static double sqrt ( double t, Double precise) {
double x = t, differ,prec = precise != null ? precise : 1e-5;
while ( differ > prec || differ < -prec ) {
x = ( x * x + t ) / ( 2 * x );
differ = x * x - t;
}
return x;
}