// 兩個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.