调用标准c库的sqrt函数,发现该函数有2k多大小,当然执行时间也就很长了,根本不适合单片机的运算。故而,网上找了一个简化的算法,编译出来后,只有不到100字节。下面分享给大家,**有帮助喔。
/****************************************/
/*Function: 开根号处理 */
/*入口参数:被开方数,32位无符号整数 */
/*出口参数:开方结果,16位无符号整数 */
/****************************************/
unsigned int sqrt_16(unsigned long M)
{
unsigned int N, i;
unsigned long tmp, ttp; // 结果、循环计数
if (M ==0) // 被开方数,开方结果也为0
return 0;
N = 0;
tmp = (M >> 30); //获取最高位:B[m-1]
M <<= 2;
if (tmp >1) // 最高位为1
{
N++; // 结果当前位为1,否则为默认的0
tmp -= N;
}
for (i=15; i>0; i--) // 求剩余的15位
{
N <<=1; // 左移一位
tmp <<= 2;
tmp += (M >>30); // 假设
ttp = N;
ttp = (ttp<<1)+1;
M <<= 2;
if (tmp >=ttp) // 假设成立
{
tmp -=ttp;
N ++;
}
}
return N;
}
原文链接:https://blog.csdn.net/baodewang/article/details/108398109
|