알고리즘 :: floor 함수로 반올림하기

2009/02/20 15:00

이 글에서 소개할 내용은 알 사람은 다들 알지만, 그래도 혹 (저처럼)모르는 분들을 위한 글입니다. 결국, 정리하자면 정리용 메모라는...

C 표준 라이브러리에는 math.h 헤더파일이 있고, 그 안에는 floor 함수가 있습니다. 이 함수의 의미는

주어진 인수보다 크지 않은 최대 정수

입니다. 즉, 주어진 인수가 x라고 하면, x-1보다 크거나 같고 x보다 작은 정수를 뜻합니다. 위키피디어에서는 이를 아래와 같이 그래프로 간단히 표현해놨습니다.
사용자 삽입 이미지
이 floor 함수를 이용하면 반올림도 할 수 있습니다. 간단한게 함수의 인수에 0.5를 더하면 끝입니다.

인수가 0.4이면, 0.5를 더해서 0.9가 될 것이고 floor 함수에 의해 0이 될 것입니다. 인수가 0.6이면, 1.1이 될 것이고 floor 함수에 의해 1이 될 것입니다. 그러면 0.5는 어떨까요? 역시 1이 됩니다.

반대로 음수에서는 인수가 -0.4이면 0.5를 더해서 0.1, floor 함수에 의해 0이 될 것입니다. -0.4는 -0.5보다 크므로 반올림이 된 게 맞습니다.

이것을 『혼자 연구하는 C/C++』에서는 간단하게 매크로로 정의해 두었습니다.

#define RoundOff(x, dig) (floor((x) * pow(10,dig) + 0.5) / pow(10,dig))


사실, 매크로보다 함수가 더 좋다고 생각하는데, 함수로 하면 자료형에 영향을 받아서 참 애매하네요. 실제로 인자 x를 int 형으로 정의하면 원하지 않는 다른 값이 나오더군요. 하지만 경우에 따라서 적절하게 함수로 정의할 수 있겠지요.

인자 dig는 자리수를 뜻합니다. 아래의 그림을 보세요.

사용자 삽입 이미지

'-3 자리', ... '4 자리' 라고 적힌 부분의 수가 dig입니다. 보시다시피 dig가 -1이면, 10-1을 곱하여(다르게 말해서 10으로 나누어) 자리수를 내린 다음 반올림하고 다시 10-1로 나누어(다르게 말해서 10을 곱하여) 자리수를 올립니다. 그리고 결과값은 1 번째 자리에서 반올림한 것과 같죠.

그렇다면 dig가 1일 때는 어떨까요? 거꾸로입니다. 자리수를 올려서 반올림하고 다시 내리는 과정을 거칩니다. 이때 결과값은 소수점 이하 1 번째 자리까지 반올림한 것과 같습니다.

정리하면, 다음과 같습니다.

  • dig < 0, dig 번째 자리에서 반올림.
  • dig = 0, 1의 자리까지 반올림. 즉, 소수점 1 번째 자리에서 반올림.
  • dig > 0, 소수점 dig 번째 자리까지 반올림.

이렇게 dig가 양수냐 음수냐에 따라 말이 조금 바뀝니다. 주의! 주의!

그런데 C에서는 floor 함수를 이용할 수 있다고 치면, 다른 언어에서는 어떻게 반올림을 하는지 궁금하네요. 지나가다가 이 글을 보시는 분은 살짝 제게 알려주시면...^^;

아무튼 여기까지 모자란 글을 읽어주시어 고맙습니다.

참고 문헌

Floor and ceiling functions :: http://en.wikipedia.org/wiki/Floor_%28programming%29
크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 #1. 내 머리 속의 노트/알고리즘, 각개격파! , , , , , , ,

Trackback Address:http://hisjournal.net/blog/trackback/163
  1. 오늘 대략 바깥을 돌아다니느라 답이 늦었네요.
    http://www.ontown.net/guide/townguide.php 요기서 오픈아이디부분을 잘 읽어주시고 다시 신청해주세요~~ ^^^;;;

  2. java 에서도 Math package에 floor(double x) 함수가 있습니다. 사용법은 동일합니다.

    그리고 위의 매크로에 대한 설명에서 함수로 구현하실 때 x를 double로 잡아주셔야 하는 것 아닐까요? int 로 선언하게 되면 소수점 이하가 날아가버리니까요... precision 은 double로 유지하시면 원하는 함수가 나올것 같네요~

  3. Blog Icon
    아리새의펜촉

    예. double로 잡아줘야합니다.

    x를 int로 받아서 처리하려고 하면 조금 더 복잡해지더라구요^^; 넘겨받은 x가 int인지, double인지 검사도 해야하고... 아니면 void*로 처리할 수 있지 않을까 싶기도 하고... short, int, float, double, unsigned 모두를 만족하려면...

    자바에도 같은 함수가 있군요. 오! 좋은 정보 고맙습니다^^

  4. 자바와 비슷한 자바스크립트에도 Math.floor()가 있지요 ㅎㅎ
    초보지만 한때 자바를 했던 저는 아리새의 펜촉님의 프로그래밍 관련 포스트가 관심이 많이 가네요 ^^

  5. Blog Icon
    아리새의펜촉

    아! 그러고보니 블로그에 있는 GRE 퀴즈... 게다가 글마다 같이 나오는 MS 기사들...

    IT 쪽에 계신거였군요. 보잘 것 없는 제 글에 관심 가져주셔서 정말 고맙습니다. (ㅡ.ㅡ) 꾸벅...

[로그인][오픈아이디란?]