프로그래밍/C++2011. 3. 22. 09:56

operator 변환타입()
{
           본체
}

키워드 operator 다음에 변환하고자 하는 타입의 이름을 밝히고 본체에는 변환 방법을 작성한다. 변환함수는 인수를취하지 않으며 리턴 타입도 지정하지 않는다. 왜냐하면 연산 대상은 자기 자신으로 고정되어 있고 변환 결과는 지정한 타입임을 이미 알고 있기 때문이다. 객체 자신을 다른 타입으로 변환하는 동작을 하므로 작업거리와 결과가 이미 정해져있는 것이다.

즉, 이미 operator 다음에 변환할 타입이 지정되어 있기 때문에 일반함수처럼 앞에 리턴 타입이 필요 없다

'프로그래밍 > C++' 카테고리의 다른 글

유닉스 - math 함수 포함된 소스 컴파일 하기  (0) 2011.03.18
소수점 반올림  (0) 2011.03.18
C++ 디버깅시 TRACE 사용하기  (0) 2009.12.10
STL - List 사용하기  (0) 2009.07.16
파일 입출력 및 링크드 리스트  (1) 2009.05.01
Posted by 마블(이환문)
프로그래밍/C++2011. 3. 18. 17:46

유닉스에서 math.h 헤더 파일을 포함시키고 컴파일 하게 되면

에러가 발생한다. 이를 해결하기 위해서는 컴파일 명령시 -lm을 붙여준다.

예)
gcc -o test test.c -lm
gcc test.c -lm

이와 같이 컴파일을 하면 된다.

'프로그래밍 > C++' 카테고리의 다른 글

operator LPCTSTR()  (0) 2011.03.22
소수점 반올림  (0) 2011.03.18
C++ 디버깅시 TRACE 사용하기  (0) 2009.12.10
STL - List 사용하기  (0) 2009.07.16
파일 입출력 및 링크드 리스트  (1) 2009.05.01
Posted by 마블(이환문)
프로그래밍/C++2011. 3. 18. 17:02

실수 x 반올림한 = floor(x+0.5)

 

척 보면 이해가 갈 것이다. 0.5를 더한 후 바로 왼쪽의 정수를 찾으면 이 값이 바로 반올림값이 된다. 어째서 이게 반올림이 되는가 선뜻 이해가 가지 않는다면 x에 1.4와 1.5를 대입해 보도록 하자.

 

floor(1.4+0.5) = 1.0

floor(1.5+0.5) = 2.0

 

1.4에 0.5를 더하면 1.9가 되는데 이 값을 내림하면 1.0이 된다. 1.5에 0.5를 더하면 2.0이 되므로 내림이 발생하지 않으며 2.0의 값을 그대로 유지할 것이다. 그러므로 floor(x+0.5)라는 공식은 0.5이상의 값은 다음 오른쪽 정수로 올림하고 0.5미만의 값은 직전의 왼쪽 정수로 내림함으로써 반올림 계산을 멋지게 하고 있는 것이다.

그렇다면 floor(x+0.5) 대신 ceil(x-0.5) 공식을 사용하는 것은 어떤 효과가 있을까? 두 공식은 비슷하지만 0.5의 경계에 걸렸을 때의 처리가 조금 다르다. floor(x+0.5)는 0.5 이상의 값을 반올림하는데 비해 ceil(x-0.5)는 0.5초과 값을 반올림한다. x가 1.5일 때 floor는 2.0으로 반올림하지만 ceil은 1.0으로 내림해 버릴 것이다. 물론 x가 1.500001이라면 ceil도 2.0으로 반올림을 한다. 두 공식의 차이를 그림으로 그려 보면 반올림되는 범위가 조금 다르다.

일반적으로 반올림이라 하면 0.5 이상을 올림하는 것이므로 floor 함수를 사용하는 것이 논리적으로 합당하다. 이 반올림 공식이 음수의 경우에도 제대로 동작하는지 확인해 보기 위해 x에 -1.4, -1.5, -1.6을 대입해 보자.

 

floor(-1.4+0.5) = -1.0

floor(-1.5+0.5) = -1.0

floor(-1.6+0.5) = -2.0

 

-1.4나 -1.6의 경우는 쉽게 이해가 되지만 -1.5를 반올림했을 때 -2.0이 아닌 -1.0이 된다는 점이 순간적으로 조금 헷갈릴 것이다. 그러나 수직선을 그려 놓고 생각해 보면 제대로 반올림되었다는 것을 확인할 수 있다. int(x+0.5)도 floor(x+0.5)와는 다르다. 캐스트 연산자는 무조건 소수점 이하를 기계적으로 잘라 버리기 때문에 x가 음수일 경우 터무니없는 결과가 나온다.

C는 자주 사용하는 기능에 대해 표준 함수들을 제공하지만 응용이 가능한 기능에 대해서는 별도의 함수를 제공하지 않는다. floor라는 간단한 함수로 반올림을 하는 것처럼 표준 함수를 조금만 응용하면 얼마든지 좀 더 복잡한 연산을 만들어 쓸 수 있기 때문이다. 표준 함수들을 많이 아는 것도 중요하지만 이미 알고 있는 함수들을 응용하는 능력도 중요하다. 이번에는 floor 함수를 한단계 더 응용하여 소수점 둘 째자리에서 반올림되도록 해 보자. 이 공식은 다음과 같다.

 floor(x*10+0.5)/10

x를 10배한 후 반올림하고 다시 10으로 나누면 소수점 둘 째자리에서 반올림된다. x가 3.14라고 했을 때 31.4로 만든 후 0.5를 더해 31.9로 만들고 이 값에 대해 floor 함수를 호출하면 31이 된다. 결과값을 다시 10으로 나누면 3.1이 될 것이다. 원래 x값에 10을 곱해 소수점을 잠시 왼쪽으로 한칸 옮긴 후 반올림 처리하고 다시 오른쪽으로 한칸 옮기는 것이다.

같은 원리로 소수점 셋 째자리에서 반올림하려면 floor(x*100+0.5)/100 공식을 사용하면 되고 소수점 넷 째자리에서 반올림하려면 floor(x*1000+0.5)/1000 공식을 쓴다. 곱하고 나누는 수만 조정하면 반올림되는 자리수를 원하는대로 지정할 수 있고 더하는 0.5를 조정하면 반올림 경계도 입맞대로 설정할 수 있다. 이 공식을 좀 더 일반화하면 소수점 n번째 자리에서 반올림되는 함수를 만들 수 있는데 아주 간단하므로 매크로 함수로 정의해 보았다.

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



츌처 : www.winapi.co.kr

'프로그래밍 > C++' 카테고리의 다른 글

operator LPCTSTR()  (0) 2011.03.22
유닉스 - math 함수 포함된 소스 컴파일 하기  (0) 2011.03.18
C++ 디버깅시 TRACE 사용하기  (0) 2009.12.10
STL - List 사용하기  (0) 2009.07.16
파일 입출력 및 링크드 리스트  (1) 2009.05.01
Posted by 마블(이환문)