|
| Posted by 지상현 | 2013-01-05 16:54:05, Hit : 5006 | |
|
|
|
오랜만입니다.
바람 님의 댓글을 보고 생각나서 적어봅니다.
다들 반올림이 무엇인지 알고 계시겠지만, 컴퓨터, 특히 창조에서 반올림이 어떻게 이루어지는지 정확하게 짚은 자료가 없더군요.
우선 창조에서 지원하는 반올림 관련 함수는 무엇이 있는지 보겠습니다.
실수함수: 반올림(실수: 수)
실수함수: 대반올림(실수: 수)
실수함수: 소반올림(실수: 수)
각 함수는 무슨 일을 할까요?
반올림 함수는 한 마디로 사사오입. (이 아니라는 것을 아래에서 밝힙니다)
대반올림 함수는 '올림'입니다. 다른 언어에서는 ceil 이라고 부를 것 같네요.
소반올림 함수는 '버림'입니다. 지금보니 이름을 조금 이상하게 지은게 아닌가 싶네요 ^^; 다른 언어에서는 floor에 해당합니다.
그런데, 사실 반올림이라는게 그리 만만한 주제가 아니더군요.
우선 음수일 때 어떻게 될까요? 답을 먼저 볼까요.
반올림(-1.2) = -1
대반올림(-1.2) = -1
소반올림(-1.2) = -2
반올림(-3.7) = -4
대반올림(-3.7) = -3
소반올림(-3.7) = -4
대반올림과 소반올림 결과에 주의하세요.
음수가 아니면 다음과 같이 나옵니다.
반올림(1.2) = 1
대반올림(1.2) = 2
소반올림(1.2) = 1
반올림(3.7) = 4
대반올림(3.7) = 4
소반올림(3.7) = 3
언뜻 반대로 나오는 것 같지만, 음수 부호가 붙어 있을 때는 숫자가 클수록 '작은 수'기 때문에 그렇습니다.
수직선으로 보면 쉽게 알 수 있습니다.
-4 -3 -2 -1 0 1 2 3 4
-----+-----+-----+-----+-----+-----+-----+-----+-----+-----
^ -3.7 ^-1.2 ^ 1.2 ^ 3.7
대반올림은 무한대 방향, 즉 오른쪽에 있는 가장 가까운 정수를 골라줍니다.
따라서 1.2 -> 2, 3.7 -> 4 가 되며, 마찬가지로 -1.2 -> -1, -3.7 -> -3 이 됩니다.
소반올림은 대반올림과 반대로 음의 무한대 방향, 즉 왼쪽에 있는 가장 가까운 정수를 골라줍니다.
따라서 1.2 -> 1, 3.7 -> 3 이 되고, -1.2 -> -2, -3.7 -> 4 가 됩니다.
참고로, 두 함수 모두 넣어준 값이 그냥 정수면 그 값을 그대로 돌려줍니다.
자기가 수직선 위에 서있는 자리도 고려해서 값을 결정한다는 뜻이지요.
반올림은 어떨까요?
수직선 위에서 왼쪽이든 오른쪽이든 가까운 정수값을 고른다고 보시면 됩니다.
그런데, 0.5 값은 어떻게 될까요?
0.5는 0과 1 사이의 정확히 가운데 있는 숫자입니다.
0.5를 반올림하면 무슨 숫자가 나올까요? 사사오입으로 배우신 많은 분들이 1이라고 생각하시지만, 실제로 창조에서 해보면 조금 의외의 결과가 나옵니다.
반올림(0.5) = 0
반올림(1.5) = 2
왜 이렇게 나올까요?
1.5가 2가 되는건 맞는 것 같은데, 0.5가 0이 되는 것에 의아하신 분들이 계실 겁니다.
그것은, 창조에서 사용하는 반올림은 Round half to even (Banker's rounding) 이라는 방법을 사용하기 때문입니다.
가장 가까운 정수를 고르는 것이 아니라, 가장 가까운 짝수를 고르는 것입니다.
숫자 몇 개를 더 해보겠습니다.
반올림(2.5) = 2
반올림(3.5) = 4
반올림(4.5) = 4
반올림(5.5) = 6
반올림(6.5) = 6
가장 가까운 짝수를 고르는 것을 알 수 있습니다.
그렇다면 왜 중간값(0.5)을 이렇게 반올림 하는 걸까요?
통계적으로, 이렇게 하면 평균 등을 구할 때 반올림 하고 구한 값과 원래 값으로 구한 값이 비슷해지기 때문이라고 하네요.
다른 언어에서도 반올림은 대부분 이런 방법으로 제공합니다.
보통 반올림을 쓰는 용도를 생각해보면 그냥 써도 사실 별 문제 없지만, 이런 세부사항을 모르고 있다가 황당한 일을 당하는 경우가 생길 수 있으므로, 역시 알아두는게 좋습니다.
참고로, 사사오입은 다음과 같이 구현하시면 됩니다.
소반올림(값 + 0.5) |
|
|
바람 2013-01-08 AM 3:50:51 |
|
|
|
헐.. 반올림이 가까운 짝수를 출력해준다는 것을 처음 알았습니다.
마지막의 '소반올림(값 + 0.5)'를 이용해야겠군요.
안그래도 수식계산 기능 추가된 csv읽고쓰기에 결과값이 소수점일때 사용자가 지정한 자리수만큼 반올림,소반올림,대반올림 할 수있는 기능을 넣을까... 하고있었는데.. 올려주신 글이 많은 도움이 될듯합니다.^^
좋은 강좌 항상 감사합니다.
좀 늦었지만, 올해 하는일 모두 성취되길 기원합니다.^^ |
|
|
지우개 Expert 3.0 제작자 : 천호성 님 [LINK] |
|
|
|
대박로또2005 제작자 : 최재일 님 [LINK] |
|
|
1 | 박종훈 님 | 15292 점 | |
2 | 지상현 님 | 8809 점 | |
3 | 손상진 님 | 7388 점 | |
4 | 권선중 님 | 6060 점 | |
5 | 이진백 님 | 5174 점 | |
|
|
|
가입일 | 닉네임 |
05/31 | 김동률 |
03/31 | 홍형기 |
09/01 | o00pp99oo |
12/27 | 이재민 |
11/20 | 이희철 |
|
|
|
|
. |
. |
. |
|