DWORD에 FLOAT를 라운드오프에러 없이 전달하기

 

C++에서는 함수 오버로딩을 하면 될텐데, DWORD 변수에 FLOAT값을 전달해야 하는지 의문이 들것이다.
C언어를 지원 해야 하는 경우나 윈도우즈 API 함수의 경우 사용된다.

#include <stdio.h>
typedef          __int32         DWORD;
typedef          float           FLOAT; 

void ShowFloat(DWORD dwNum)
{
    printf("Number %f\n", (float)dwNum);
}

 

void main()
{
    ShowFloat((DWORD)5.5f);
    getchar();
}

<결과>
Number 5.000000

일반적인  캐스팅을 사용해서 변수를 전달하면 소수점 이하의 유효자리는 잃어 버리게 된다.
5.5가 출력되지 않고 5가 출력 될 것이다.

#include <stdio.h>

typedef          __int32         DWORD;
typedef          float           FLOAT;

inline DWORD        FTODW(FLOAT   f)   {  return  *((DWORD*)&f);   }
inline FLOAT        DWTOF(DWORD  dw)   {return *((FLOAT*)&dw);  }


void ShowFloat(DWORD dwNum)
{
    printf("Number %f\n", DWTOF(dwNum));
}


void main()
{
    ShowFloat(FTODW(5.5f));
    getchar();
}

<결과>
Number 5.500000

포인터는 비트 자체가 의미 있는 값이므로, 가리키는 대상이 다른 포인터 사이의 형 변환은
이진 비트열을 파괴하지 않는다.

 

 

[참조] 민프레스 게임개발자를 위한 C++ 76Page