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

tech2025-05-21  12

最近,做项目时,需要使用开发运算,但是调用标准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)