最近,做项目时,需要使用开发运算,但是调用标准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;
} |