//*******************************************************************************
// 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
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
文章评论(0条评论)
登录后参与讨论