[开发工具] 单片机上如何实现快速的开方运算

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

  34.    return N;
  35. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

1506

帖子

2

粉丝
快速回复 返回顶部 返回列表