본문 바로가기

Windows/MFC

MulDiv

원형

int MulDiv(int nNumber, int nNumerator, int nDenominator);

MFC 원형

해당하는 함수 없음

인수

▶nNumber : 계산에 사용될 값

▶nNumerator : 곱해지는 값

▶nDenominator : 나누는 값

리턴

성공했을 경우 계산값을 곱하고 나눈 결과를 리턴한다. 오버플로우가 발생했거나 나누는 값이 0인 경우는 -1을 리턴한다.

설명

nNumber * nNumerator / nDenominator 식을 계산한다. 즉 첫번째 인수와 두번째 인수를 곱하고 그 결과를 세번째 인수로 나눈 결과를 리턴해 준다. 다음 예를 보자.

a=12;
b=23;
c=3;
d=MulDiv(a,b,c);

이 경우 d는 12*23/3의 결과는 92로 계산된다. 이런 계산은 굳이 함수를 사용하지 않고 곧바로 수식을 사용해도 될 것 같지만 MulDiv 함수는 계산중의 오버플로우를 처리해준다는 점에 있어서 수식과는 다르다. 만약 곱한 결과가 32비트 범위를 넘어서더라도 나눈 결과가 다시 32비트 범위에 든다면 정상적인 계산이 수행된다.

예제 1

다음 예제는 32비트 범위를 넘어서는 곱셈과 나눗셈의 예를 보여준다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	int a,b,c,d;
	char str[128];

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		a=1234567;
		b=8901234;
		c=123456;
		d=MulDiv(a,b,c);
		wsprintf(str,"결과는 %d입니다",d);
		TextOut(hdc,10,10,str,lstrlen(str));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

a와 b를 곱한 결과는 1조단위이지만 이 값을 다시 나누면 32비트 범위안의 결과를 리턴하므로 정상적인 계산을 해 낸다. 그러나 이 함수 대신 1234567 * 8901234 / 123456라는 수식을 곧바로 사용하거나 d=a*b/c라는 수식을 사용하면 오버플로우에 의해 제대로 결과를 계산하지 못한다.

참고함수

Int32x32To64, UInt32x32To64

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr

'Windows > MFC' 카테고리의 다른 글

[GDI+] 이미지에 Anti-aliasing (안티 알라이싱) 주기  (0) 2013.10.02
[GDI+] RoundRect  (0) 2013.10.02
GetSystemMetrics  (0) 2013.10.02
CTypedPtrList  (0) 2013.10.02
outlook style splitter  (0) 2013.10.02