|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2009-8-10 08:13:18
|
显示全部楼层
unsigned int sqrt_16(unsigned long M)
{
unsigned int N, i;
unsigned long tmp,M1,tmp2;
union
{
ulong ttp_u;
uint ttp_a[2];
}ttp_us;
if (M == 0)
return 0;
N = 0;
M1=M;
ttp_us.ttp_u=M;
tmp = (ttp_us.ttp_a[1]>>14);
ttp_us.ttp_u<<= 2;
if (tmp > 0)
{ N ++;
tmp -= N;
}
for (i=15; i>0; i--)
{ N <<= 1;
tmp <<= 2;
tmp += (ttp_us.ttp_a[1]>>14);
tmp2 = N;
tmp2 = (tmp2<<1)+1;
ttp_us.ttp_u <<= 2;
if (tmp >= tmp2)
{ tmp -= tmp2;
N ++; }
}
tmp=(ulong)(N*N);
if((uint)(M1-tmp)>N)
{
++N;
}
return N;
}
再优化下,我用的16位单片机,有
SHRW AX, cnt 指令,一周期,所以快,
不好意思没说清楚,谢谢各位在其他单片机上验证 |
|