[研电赛技术支持] 如何实现快速的开方运算

[复制链接]
939|7
 楼主| tifmill 发表于 2023-9-27 22:44 | 显示全部楼层 |阅读模式
  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. }


AloneKaven 发表于 2023-9-29 22:31 来自手机 | 显示全部楼层
这个用math库不行吗?
tpgf 发表于 2023-10-12 16:32 | 显示全部楼层
这个算法的原理是什么呢
paotangsan 发表于 2023-10-12 16:48 | 显示全部楼层
AloneKaven 发表于 2023-9-29 22:31
这个用math库不行吗?

可以呀 但是这样做的话 对单片机的负担就太大了
wakayi 发表于 2023-10-12 17:05 | 显示全部楼层
这里边一共需要运行多少个时钟周期啊
xiaoqizi 发表于 2023-10-12 18:33 | 显示全部楼层
这种方式需要把16位的数据弄成32位的处理是吧
wowu 发表于 2023-10-12 19:07 | 显示全部楼层
位数多的话会不会循环次数过多呢
renzheshengui 发表于 2023-10-12 19:41 | 显示全部楼层
主要是对这种算法的原理不太了解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

1629

帖子

0

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