알고리즘 :: floor 함수로 반올림하기
2009/02/20 15:00
이 글에서 소개할 내용은 알 사람은 다들 알지만, 그래도 혹 (저처럼)모르는 분들을 위한 글입니다. 결국, 정리하자면 정리용 메모라는...
C 표준 라이브러리에는 math.h 헤더파일이 있고, 그 안에는 floor 함수가 있습니다. 이 함수의 의미는
주어진 인수보다 크지 않은 최대 정수
입니다. 즉, 주어진 인수가 x라고 하면, x-1보다 크거나 같고 x보다 작은 정수를 뜻합니다. 위키피디어에서는 이를 아래와 같이 그래프로 간단히 표현해놨습니다.

인수가 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"#1. 내 머리 속의 노트 / 알고리즘, 각개격파!" 분류의 다른 글
| [알고리즘] 원탁의 기사 (The Knights of the Round Table) (0) | 2010/06/09 |
| 자료구조 :: 양방향 원형 연결리스트 (0) | 2010/01/01 |
| 자료구조 :: 크기가 조정되는 배열 스택 (0) | 2009/12/20 |
| 알고리즘 :: 함수의 반환값을 범위 점검할 때 abs 함수를 응용하자. (2) | 2009/02/26 |
| 알고리즘 :: 최적화된 에라토스테네스의 체 (4) | 2009/02/23 |
| 알고리즘 :: XOR 스왑 알고리즘의 문제점이 무엇일까? (0) | 2009/01/19 |
| 알고리즘 :: 소수인지 판별하는 알고리즘을 최적화하자. (4) | 2009/01/18 |
| 알고리즘 :: XOR 연산을 이용하여 스왑 알고리즘을 최적화하자. (0) | 2009/01/15 |
| 컴파일러도 "귀찮다" 라고 말하는 하노이 탑 문제 (2) | 2009/01/13 |
| 알고리즘 :: 입력된 수가 소수인지 확인하자. (2) | 2009/01/13 |
Trackback Address:http://hisjournal.net/blog/trackback/163
오늘 대략 바깥을 돌아다니느라 답이 늦었네요.
http://www.ontown.net/guide/townguide.php 요기서 오픈아이디부분을 잘 읽어주시고 다시 신청해주세요~~ ^^^;;;
java 에서도 Math package에 floor(double x) 함수가 있습니다. 사용법은 동일합니다.
그리고 위의 매크로에 대한 설명에서 함수로 구현하실 때 x를 double로 잡아주셔야 하는 것 아닐까요? int 로 선언하게 되면 소수점 이하가 날아가버리니까요... precision 은 double로 유지하시면 원하는 함수가 나올것 같네요~
예. double로 잡아줘야합니다.
x를 int로 받아서 처리하려고 하면 조금 더 복잡해지더라구요^^; 넘겨받은 x가 int인지, double인지 검사도 해야하고... 아니면 void*로 처리할 수 있지 않을까 싶기도 하고... short, int, float, double, unsigned 모두를 만족하려면...
자바에도 같은 함수가 있군요. 오! 좋은 정보 고맙습니다^^
자바와 비슷한 자바스크립트에도 Math.floor()가 있지요 ㅎㅎ
초보지만 한때 자바를 했던 저는 아리새의 펜촉님의 프로그래밍 관련 포스트가 관심이 많이 가네요 ^^
아! 그러고보니 블로그에 있는 GRE 퀴즈... 게다가 글마다 같이 나오는 MS 기사들...
IT 쪽에 계신거였군요. 보잘 것 없는 제 글에 관심 가져주셔서 정말 고맙습니다. (ㅡ.ㅡ) 꾸벅...