快速开方算法比较:
public class Test {
private static int a,b,c,p=0x80;
private static int K,A,B,C,R=0x4000,D=60000;
public static float sqt1(){
if(D>50176){A=0; a=0; C=50176;c=224;} // 查表
else if(D>36864){A=50176;a=224;C=36864;c=192;}
else if(D>25600){A=36864;a=192;C=25600;c=160;}
else if(D>16384){A=25600;a=160;C=16384;c=128;}
else if(D>9216) {A=16384; a=128;C= 9216; c= 96;}
else if(D>4096) {A= 9216; a= 96; C= 4096; c= 64; }
else if(D>1024) {A= 4096; a= 64; C= 1024; c= 32; }
else {
A= 1024; a= 32; C= 0; c= 0;
}
p=16;R=256; // 初始化数据
do{ b=c+p;B=C;B>>=1; // 插值计算循环
if(A!=0){K=A;K>>=1;}
else K=0x8000; // 65536>>=1的数
B+=K;B-=R;
if(D>B){C=B;c=b;}
else{A=B;a=b;}
p>>=1;R>>=2;
}while(p!=1); // 循环4次结束
K=A-C;K>>=2;A-=K; C+=K; // 小数部分四舍五入
if(D<C)b=c;
else{
if(D<A)b=++c;
else b=a;
}
return b;
} //输出方根b
/**
* @param args
*/
public static void main(String[] args) {
Calculagraph.getInstance("fast").mark(null);
int i=0;
for(i=0;i<655350;i++)
{
D=i;
sqt1();
}
System.out.println(i);
Calculagraph.getInstance("fast").mark("end");
System.out.println(Calculagraph.remove("fast").getInfo()); //30ms
Calculagraph.getInstance("normal").mark(null);
for(i=0;i<655350;i++)
{
Math.sqrt(i);
}
System.out.println(i);
Calculagraph.getInstance("normal").mark("end");
System.out.println(Calculagraph.remove("normal").getInfo()); //10ms
}
}