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

[复制链接]
696|1
 楼主| primojones 发表于 2023-9-28 06:26 | 显示全部楼层 |阅读模式
  1. 调用标准c库的sqrt函数,发现该函数有2k多大小,当然执行时间也就很长了,根本不适合单片机的运算。故而,网上找了一个简化的算法,编译出来后,只有不到100字节。下面分享给大家,**有帮助喔。





  2. /****************************************/
  3. /*Function: 开根号处理                 */
  4. /*入口参数:被开方数,32位无符号整数          */
  5. /*出口参数:开方结果,16位无符号整数           */
  6. /****************************************/
  7. unsigned int sqrt_16(unsigned long M)
  8. {
  9.     unsigned int N, i;
  10.     unsigned long tmp, ttp;   // 结果、循环计数
  11.     if (M ==0)              // 被开方数,开方结果也为0
  12.         return 0;
  13.    N = 0;
  14.    tmp = (M >> 30);          //获取最高位:B[m-1]
  15.     M <<= 2;
  16.     if (tmp >1)             // 最高位为1
  17.     {
  18.         N++;                // 结果当前位为1,否则为默认的0
  19.         tmp -= N;
  20.     }
  21.    for (i=15; i>0; i--)      // 求剩余的15位
  22.     {
  23.         N <<=1;             // 左移一位
  24.        tmp <<= 2;
  25.         tmp += (M >>30);     // 假设
  26.        ttp = N;
  27.         ttp = (ttp<<1)+1;
  28.        M <<= 2;
  29.         if (tmp >=ttp)       // 假设成立
  30.         {
  31.             tmp -=ttp;
  32.             N ++;
  33.         }
  34.    }

  35.    return N;
  36. }

  37. 原文链接:https://blog.csdn.net/baodewang/article/details/108398109


AloneKaven 发表于 2023-9-29 22:22 来自手机 | 显示全部楼层
这样优化确实厉害啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

1559

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部