这个是一个电机驱动里面抠出来的。
/*! \brief Square root routine.STM32-72M主频耗时2.5us
*
* sqrt routine 'grupe', from comp.sys.ibm.pc.programmer
* Subject: Summary: SQRT(int) algorithm (with profiling)
* From: warwick@cs.uq.oz.au (Warwick Allison)
* Date: Tue Oct 8 09:16:35 1991
*
* \param x Value to find square root of.
* \return Square root of x.
*/
unsigned long sqrt(unsigned long x)
{
register unsigned long xr; // result register
register unsigned long q2; // scan-bit register
register unsigned char f; // flag (one bit)
xr = 0; // clear result
q2 = 0x40000000L; // higest possible result bit
do
{
if((xr + q2) <= x)
{
x -= xr + q2;
f = 1; // set flag
}
else{
f = 0; // clear flag
}
xr >>= 1;
if(f){
xr += q2; // test flag
}
} while(q2 >>= 2); // shift twice
if(xr < x){
return xr +1; // add for rounding
}
else{
return xr;
}
}
转载博主的,原文连接:https://blog.csdn.net/zmazon/article/details/8217866
float SquareRootFloat(float number)
{//STM32-72M主频耗时8us
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return number * y;
}
这个是转一个博主的,误差有点大,但是很快。原文连接:https://blog.csdn.net/xh270984572/article/details/72189457
float sq(float f)
{ //快速开方,STM32-72M主频耗时1.3us
int o =((( ( *( (int*)&f ) )^0x00800000 )>>1)&0xbfffffff)+0x20000000;
if((o&0x00400000)>0)
o-=0x00800000;
return (*((float*)&o));
}