原创 32bit无符号数快速开平方根

2011-4-20 21:32 4275 9 9 分类: 软件与OS

//*******************************************************************************
// 32bit无符号数开平方根
// LHT
// 2008-07-12
// 根据网上的有关资料改写
//*******************************************************************************

#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long

//*******************************************************************************
// Function: 开根号处理
// 入口参数:被开方数,长整型
// 出口参数:开方结果,整型
//*******************************************************************************
INT16U sqrt_16(INT32U M)
{
 INT8U  f_temp,temp;
 INT16U N, i;
 INT32U tmp, ttp;     // 结果、循环计数

    if (M == 0)           // 被开方数,开方结果也为0
  return 0;

 f_temp=0;

 //if (M>=(32768UL*32768UL))
 if (M&0xc0000000)
 {
  M>>=2;    // 先除以4,防止后面的运算出错
  f_temp=1;
 }

 N = 0;

 //tmp = (M >> 30);     // 获取最高位:B[m-1]
 tmp=0;

 M <<= 2;
 if (tmp > 1)              // 最高位为1
 {
     N ++;                 // 结果当前位为1,否则为默认的0
     tmp -= N;
    }

 for (i=15; i>0; i--)      // 求剩余的15位
  {
       N <<= 1;              // 左移一位

      tmp <<= 2;
#if 0
       tmp += (M >> 30);     // 假设
#else
  temp=0;
  if (M&0x80000000)
   temp+=2;
  if (M&0x40000000)
   ++temp;

  tmp += (INT32U)temp; // 假设
#endif

        ttp = N;
        ttp = (ttp<<1)+1;

       M <<= 2;
       if (tmp >= ttp)       // 假设成立
       {
         tmp -= ttp;
          N ++;
     }
   }

 if (f_temp)
  N<<=1;

    return (N);
}
//*******************************************************************************

#if 0

INT32U data_in;
INT16U data_out;
INT16U cnt_test;
INT32U code arr_test[]=
{
 1,   //------------------1
 12,   //------------------3
 123,  //------------------11
 1234,  //------------------35
 12345,  //------------------111
 123456,  //------------------351
 1234567, //------------------1111
 12345678, //------------------3513
 123456789, //------------------11111
 1234567890, //------------------35136
 12345678901,//------------------61284?????????
 123456789012,//-----------------56548?????????

 534,  //------------------23
 23,   //------------------4
 8897,  //------------------94
 28764,  //------------------169
 676449,  //------------------822
 9887833, //------------------3144
 389723323, //------------------19741
 856453789, //------------------29265
};
//*******************************************************************************
void main(void)
{
 INT8U i;

 for (i=0;i<32;++i)
 {
  data_in=arr_test;
  data_out=sqrt_16(data_in);

  cnt_test++;
 }
 for (;;);
}
#endif
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************

 

 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条