원형 |
int MulDiv(int nNumber, int nNumerator, int nDenominator); |
MFC 원형 |
해당하는 함수 없음 |
인수 |
▶nNumber : 계산에 사용될 값 ▶nNumerator : 곱해지는 값 ▶nDenominator : 나누는 값 |
리턴 |
성공했을 경우 계산값을 곱하고 나눈 결과를 리턴한다. 오버플로우가 발생했거나 나누는 값이 0인 경우는 -1을 리턴한다. |
설명 |
nNumber * nNumerator / nDenominator 식을 계산한다. 즉 첫번째 인수와 두번째 인수를 곱하고 그 결과를 세번째 인수로 나눈 결과를 리턴해 준다. 다음 예를 보자. a=12; 이 경우 d는 12*23/3의 결과는 92로 계산된다. 이런 계산은 굳이 함수를 사용하지 않고 곧바로 수식을 사용해도 될 것 같지만 MulDiv 함수는 계산중의 오버플로우를 처리해준다는 점에 있어서 수식과는 다르다. 만약 곱한 결과가 32비트 범위를 넘어서더라도 나눈 결과가 다시 32비트 범위에 든다면 정상적인 계산이 수행된다. 다음 예제는 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 |