// 两个2字节开方程序
unsigned char a,b,p=0x80;
unsigned int K,A,B,C,R=0x4000,D=60000;
void main()
{
sqt1();
B=A=0;R=0x4000; //恢复数据
sqt2();
}
sqt1(){
do{
b=a-p;B=C;B>>=1;
if(A){K=A;K>>=1;}
else K=0x8000; //补码
B+=K;B-=R;
if(D>B)C=B;
else{A=B;a=b;}
p>>=1;R>>=2;
}while(p!=1); //循环7次
p=(A-C)>>2;A-=p; C+=p; //小数处理
b=a;
if(D if(D
sqt2(){
do{
A=B+R;B>>=1;
if(A<=D){
D-=A;B+=R;}
R>>=2;
}while(R); //循环7次
if(D>B)B++; //小数处理
}
其中,D为被开方数,,b为sqt1()的根,B为sqt2()的根.
两个函数精度一样,都是小数部分严格四舍五入,速度sqt2()更快一点(约300个指令周期).
R为计算初始参数(p为其平方根---仅为sqt1()使用),其意义见相关文章,取值根据被开方数最大值确定:
被开方数D R(16进制)
2字节16位 0x4000
18位 0x10000
20位 0x40000
22位 0x100000
3字节24位 0x400000
4字节32位 0x40000000
......以此类推.
即:R与D长度相同时,次高位为1,其余为0.