最近在网上看到开根号算法,试验了一下,其中牛顿迭代法效率和精确度最高,代码和原理如下:
public void test11(){
sqrtViolence(758223334,0.0001);
System.out.println("================分割线===================");
sqrtDichotomy(758223334,0.0001);
System.out.println("================分割线===================");
sqrtNewton(758223334,0.0001);
}
public void sqrtViolence(double v,double t){
Double result=t;
boolean flag=true;
long count=1l;
long time=System.currentTimeMillis();
while(flag){
if(result*result<=v&&(result+t)*(result+t)>=v){
flag=false;
System.out.println("sqrtViolence---------参数,v="+v+",t="+t);
System.out.println("sqrtViolence---------结果="+result);
System.out.println("sqrtViolence---------精度="+(result-Math.sqrt(v)));
System.out.println("sqrtViolence---------运算次数="+count);
System.out.println("sqrtViolence---------时间(毫秒)="+(System.currentTimeMillis()-time));
}else{
count++;
result+=t;
}
}
}
public void sqrtDichotomy(double v,double t){
Double result=t;
boolean flag=true;
Double start=0.0;
Double end=(double) v;
//初始取v的二分之一值
result=(double) (v/2);
if(v<1){
start=v;
end=1.0;
result=(end+start)/2;
}
long count=1l;
long time=System.nanoTime();
while(flag){
//首先判断是否符合要求
if(result*result<=v&&(result+t)*(result+t)>=v){
flag=false;
System.out.println("sqrtDichotomy---------参数,v="+v+",t="+t);
System.out.println("sqrtDichotomy---------结果="+result);
System.out.println("sqrtDichotomy---------精度="+(result-Math.sqrt(v)));
System.out.println("sqrtDichotomy---------运算次数="+count);
System.out.println("sqrtDichotomy---------时间(纳秒)="+(System.nanoTime()-time));
} else {
// 更新二分区间
if (result * result > v) {
end = result;
} else if (result * result < v) {
start = result;
}
// 更新结果值
count++;
result = (end + start) / 2;
}
}
}
public void sqrtNewton(double v,double t){
Double result=t;
boolean flag=true;
long count=1l;
long time=System.nanoTime();
while(flag){
if(result*result<=v&&(result+t)*(result+t)>=v){
flag=false;
System.out.println("sqrtNewton---------参数,v="+v+",t="+t);
System.out.println("sqrtNewton---------结果="+result);
System.out.println("sqrtNewton---------精度="+(result-Math.sqrt(v)));
System.out.println("sqrtNewton---------运算次数="+count);
System.out.println("sqrtNewton---------时间(纳秒)="+(System.nanoTime()-time));
}else{
count++;
result=(result+v/result)/2;
}
}
}