본문 바로가기
전자공학

정수로 제곱근 SQRT 계산하는 알고리즘

by 무에서 2017. 8. 6.
반응형

임베디드 시스템에서 저사양의 MCU를 사용할 때 라이브러리에 있는 SQRT 함수를 사용하면 시간이 많이 걸린다. 그래서, SQRT 함수를 직접 만들어 사용하는 경우가 많다.





n이 8,16,32비트일 때는 다음과 같이 코드를 수정한다.


n이 32비트 : p = 0x40000000

n이 16비트 : p = 0x4000

n이 8비트 : p = 0x40


uint32_t sqrt32 (uint32_t n)

{  

uint32_t        v, re, p;  

  

v = 0;  

r = n;  

p = 0x40000000;

  

while (p > r) p = p >> 2;  

while (p)  

{  

if (r >= v + p)  

{  

r = r - v - p;  

v = v + (p << 1);  

}  

v = v >> 1;  

p = p >> 2;  

}  

return v;  

}  



SQRT를 계산하는 다른 알고리즘은 다음과 같다.


uint16_t sqrt32(uint32_t a) 

{

    uint32_t r = 0;

    uint16_t root = 0;

    uint16_t i;


    for (i = 0; i < 16; i++) 

    {

        root <<= 1;

        r <<= 2;

        r += a >> 30;

        a <<= 2;


        if (root < r) 

        {

            root++;

            r -= root;

            root++;

        }

    }


    return (uint16_t) (root >> 1);

}



반응형

댓글