- 调用标准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
|