본문 바로가기
컴퓨터

[C언어] 반올림 함수

by Luyin 2012. 11. 20.

출처 : http://hisjournal.net/blog/163


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

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 함수를 이용할 수 있다고 치면, 다른 언어에서는 어떻게 반올림을 하는지 궁금하네요. 지나가다가 이 글을 보시는 분은 살짝 제게 알려주시면...^^;

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

'컴퓨터' 카테고리의 다른 글

메모리 구조  (0) 2012.12.09
[문서작업] MS Office 단축키  (0) 2012.11.21
변수표기법  (0) 2012.11.16
[Network] 클래스와 IP주소  (0) 2012.11.16
[NETWORK] Command-Line 네트워크 명령어  (0) 2012.11.15