baode的个人主页

http://free-tech.com.cn/php/u.php?uid=84343  [收藏] [复制]

baode离线

  • 关注:1
  • 粉丝:1
  • 访客:4
  • 等级:普通会员
  • 身份:总版主
  • 总积分:0
  • 保密 ,1960-01-01

最后登录:2016-04-12

更多资料

日志

单片机上如何实现快速的开方运算

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

分类:默认分类|回复:0|浏览:741|全站可见|转载
 

下一篇:

上一篇: