메뉴 건너뛰기


Computer Science > Algorithm

기타 수학 공식과 프로그밍의 차이

2014.01.04 03:01

푸우 조회 수:10817


수학적으로 배운내용이나 공식이 전산적 특성을 활용하면 프로그래밍이 훨씬 쉬워지기도 합니다.

이번 글은 뭐 특별한 기술적인 내용이라기 보다는 수학적인 공식을 프로그래밍으로 옮길때 조금만 전산적 특성을 적용한다면 좀 더 쉽고 빠르고 간결한 코드를 만들어 낼 수 있다는 것을 알려드리기 위함입니다. (꼭 그렇게만 되는 것은 아니겠지만...^^)


1. MIN, MAX 함수


프로그래머들은 두 수의 최대값 혹은 최소값을 구할때 max()와  min()함수를 사용합니다. 

수학적으로 MIN과 MAX를 구하는 공식은 다음과 같습니다.

min,max.png 


이를 그대로 코딩하면 다음과 같습니다.

int min(int A, int B)
{
    return (A+B-abs(A-B))/2;
}

int max(int A, int B)
{
     return (A+B+abs(A-B))/2;
}

하지만 프로그래밍에서는 조건을 판단할 수 있기 때문에 다음과 같이 사용하는게 훨씬 간단하고 좋습니다.


int min(int A, int B)
{
    if(A<B) return A;
    else return B:
}

int max(int A, int B)
{
    if(A>B) return A;
    else return B:
}

혹은


int min(int A, int B)
{
    return (A<B)?A:B;
}

int max(int A, int B)
{
    return (A>B)?A:B;
}

혹은


#define MIN(A,B)    ((A)<(B))?(A):(B)
#define MAX(A,B)    ((A)>(B))?(A):(B)



2. ABS함수


위에서 잠깐 언급된 절대값을 계산하기 위해서는 수학적으로는 다음과 같습니다.


abs.png


이를 그대로 코딩하면 다음과 같습니다.

int abs(int X)
{
    return sqrt(X*X);
}

하지만 프로그래미에서는 다음과 같이 사용하는게 훨씬 간단하고 좋습니다.

int abs(int X)
{
    if(X<0) return (X * -1);
    else return X:
}

혹은


int abs(int X)
{
    return (X<0) ? X*-1 : X;
}


혹은


#define ABS(X)    ((X)<0) ? (X)*-1 : (X)


여기서 한번 더 생각해 볼 것이 있는데 전산에서 정수의 표현이라는 것입니다.

부호화 절대치(Signed magnitude)방식에서는  부호를 결정하는 것은 이중 맨 첫번째 비트가 0이면 양수 1이면 음수가 됩니다.
즉 절대값이라는 관점에서 본다면 맨 첫번째 비트를 0으로만 만들어 주면됩니다.
일반적으로 int는 4바이트이고 
그래서 다음과 같은 코딩이 가능합니다. 

int abs(int X)
{
    return X & 0x7fffffff;
}


부호화 절대치(Signed magnitude)방식에 2의 보수법을 추가로 이용하는 수의 표현에서는 다음과 같은 코드가 적용된다.
int iabs(int X)
{
   if(X<0) return ~(X - 1);
   else return X;
}


실제 C언어로 어떻게 구현되었는지는 다음의 URL을 참고 하세요.


http://git.uclibc.org/uClibc/tree/libm?h=future

http://www.netlib.org/fdlibm/

https://github.com/Hoffa/nSDL/tree/master/tinspire/libs/fdlibm-1.5-r2