• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

首次公布:超级开方代码

这里给出两个最快速的开平方函数C语言代码,原理已经在相关文章里有叙述:


// 两个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.
全部回复(4)
正序查看
倒序查看
52919801
LV.6
2
2007-02-28 16:30
不錯!加分
0
回复
da2007
LV.2
3
2007-02-28 20:40
好样的!!
   :)!!!
0
回复
sdjufeng
LV.6
4
2007-03-02 13:34
既然用了C51,何不用系统自带的开方功能呢?
0
回复
nc965
LV.6
5
2007-03-03 11:12
@sdjufeng
既然用了C51,何不用系统自带的开方功能呢?
速度,空间都有数量级的差别
0
回复