우선 fmod라는 함수를 모르시는 분들을 위해 간단한 설명을 드리자면
fmod 는 C++ 연산에서 % 연산을 실수로 하고 싶을때 사용하는 함수라고 보면 됩니다.
기본적으로 10 % 3 이라는 연산은 에러가 나지 않지만 10.0f % 3.0f 라는 연산은 빌드 에러가 납니다.
%는 정수형으로만 연산이 되는 연산자이기 때문인데, 실수를 % 연산을 하고 싶다면 fmod를 사용하게 됩니다.
다음 예제를 한번 참고해보겠습니다.
#define D3DX_PI ((FLOAT) 3.141592654f) // d3dx9math.h
float gap = D3DX_PI * 1.5; // 4.7123890
float border = D3DX_PI / 8; // 0.39269909
int quot = (int) (gap / border);
float mod = ::fmod(gap, border);
간단하게 270도에 해당되는 gap을 22.5도에 해당되는 border로 나눈 다음 나머지는 fmod 로 구한다. 라는 간단한 연산입니다.
기본적으로 그냥 산술적인 연산은 몫은 12, 나머지는 0이 나와야 정상이지만 결과는 예상과 빗나간 다음과 같습니다.
quot : 12
mod : 0.39269897
원인은 gap / border 의 결과 때문인데, 실제 gap / border 의 연산은 11.999999696.... 이 되어 버립니다. 한없이 12에 가까운 11이 나오게 되는것이죠.
이것을 (int)로 변환하면 12가 나오게 됩니다.
하지만 mod는 몫을 정상적인 연산결과인 11.99999... 를 가지고 연산을 합니다. 그래서 mod는 예측과 다른 값을 계산하게 되는 것이죠.
프로그래밍도중 위치 방향을 잡는데 가끔 이상한 결과가 나와서 추적을 해봤는데 fmod에 대한 조심할 점을 발견하게 되었네요. 사용하실때 참고하셨으면 합니다.
그냥 MSDN같은데서 무슨 함수인지만 보고 가져다가 써먹다가
나중에 이상한 결과가 나와서 헤메는 저같은 사람에게 큰도움이 되네요.
특히 저런거는 아무리 코드만 봐서는 모르죠.
구조상으로 돌아가는 것에는 문제가 없으니까요.
중단점 넣고 하나씩 돌려봐도 그냥 저 함수만 통과하면 가끔 이상하다는 것밖에 모르고요.