<math.h>의 sqrt()함수를 이용하지 않고, 간단하게 for문 몇번 돌리는 것으로 제곱근을 구할 수 있다.
뉴튼-랩슨법을 이용해서 빠르게 제곱근을 계산할 수 있다.



double mysqrt(unsigned int number)
{
    unsigned int NUM_REPEAT = 16;
    unsigned int k;
    double res;
    double tmp = (double)number;
    for(k=0,res=tmp;k<NUM_REPEAT;k++)
    {
        if(res<1.0)
            break;
        res = (res*res+tmp)/(2.0*res);
    }
    return res;
}


여기서 NUM_REPEAT는 for문의 반복 횟수를 의미하는데, 크면 클 수록 정확한 값을 구한다. 16~20정도면 상당히 정확한 값을 구할 수 있다. 10진법 소수점 단위로 비교하면서 구하는것보단 훨씬 빠르게 구하지만, <math.h>의 sqrt()함수보다 빠르진 않다.

뉴튼-랩슨법의 자세한 원리는 인터넷에서 찾아보면 된다. 원리만 알면 매우 쉽다.
Posted by Нуеоп
이전버튼 1 이전버튼