알고리즘 :: 함수의 반환값을 범위 점검할 때 abs 함수를 응용하자.

2009/02/26 13:45

abs 함수에 대해 다들 잘 아실 것입니다. 절대값을 구하는 함수지요. 이 abs 함수를 응용하면 함수의 반환값을 범위 점검할 때 걸리는 시간을 줄일 수 있습니다.

가령, 이와 같은 코드가 있다고 가정하겠습니다.

if((Func(i) > MIN) && (Func(i) < MAX));


Func 함수에서 반환된 값이 MIN ~ MAX 사이의 범위에 있는지 점검하는 코드입니다. 이 코드는 함수를 2회 호출합니다. 만약 1회만 호출하여 같은 연산을 할 수 있다면 시간상 유리할 것입니다.

아래 처럼요.

if(abs((Func(i)) - (MIN+MAX)/2) < (MAX-MIN)/2);


abs 함수를 응용하였습니다. Func 함수의 반환값과 MIN ~ MAX 범위의 중간값의 차이가 MAX(혹은 MIN) 와 중간값의 차이보다 작은지 점검합니다. 즉, Func 함수의 반환값이 MIN ~ MAX 사이의 범위에 있는지 점검하는 것이죠. 위의 코드와 똑같이 작동합니다. 다만, 함수를 1회만 호출한 것이 차이입니다.

이 두 코드의 차이는 시간상으로 나타납니다. 그래서 두 코드의 결과를 비교해보겠습니다. 아래를 보시면,

사용자 삽입 이미지

abs 함수를 응용한 코드가 약 2배 정도 빠름을 알 수 있습니다. 만약 Func 함수가 시간이 제법 걸리는 함수라면 이 차이는 더욱 커지겠죠.

덧붙임

그런데 C 표준 라이브러리에는 왜 abs 함수가 stdlib.h에 있는건지 모르겠습니다. 멋모르고 math.h를 include했더니 경고만 나오더군요.
크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 0x07 알고리즘 , , , , , , ,

Trackback Address:http://hisjournal.net/blog/trackback/171
  1. Blog Icon
    kimtpc

    int a = func(i);
    if( (a > MIN) && (a < MAX) )

    하시면 되지 않을까요

  2. Blog Icon
    아리새의펜촉

    아! 그렇네요... (>_<);

    이렇게 더 간단한 방법이...