float형을 int로 빠르게 cast하는 방법
Posted 2006년 08월 21일 22시 55분, Filed under: Teeny Tools/Etc.#ifdef __BIGENDIAN__
# define FTOI_LONG reserved, l
#else
# define FTOI_LONG l
#endif
#define USE_FTOI register union{ double r; struct { _integer4 FTOI_LONG; } l; } __ftoitmp;
#define OP_FTOI(val)\
( ( (__ftoitmp.r=(val)+((((65536.*65536.*16.)+(65536.*.5))*65536.)) ),\
__ftoitmp.l.l-0x80000000L ) )
이렇게 해주면 (int) 로 하는 것보다 더 빠르다는군요.
안해봐서 모르겠습니다.
몰랐네...
(전에 올렸던 소스는 틀린 것으로 확인 되었습니다.)
여러번 반복적으로 쓰는 루틴의 경우는
if문 사용을 줄이거나 for문 사용을 줄이거나..
비트연산으로 바꿔주면.. 정말 꽤 효과가 있죠.
당연하겠지만서도..
출처: http://kldp.org/node/44000

Trackback URL : http://php.chol.com/~perrkoo/tt/trackback/212
-
*(int*)# ==> 음 이거 이렇게 해주면 형변환 안일어나는거 아닌가요?
num의 주소(float형 포인터)를 int형 포인터로 형변환 한후에 참조한다..라면..
float형 data을 int방식으로 읽는 거일듯 한데... 그러면 저렇게 읽은 값은 이상한 값이 될듯..
보통 저런 기법은 float 값등을 다른 형의 포인터로 함수에 넘기고 싶을때 사용하는듯 싶어요.
<아래는 int가 아닌 DWORD형 포인터로 넘기는 예>
...
float fDepthBias = 1.0f;
d3dDevice->SetRenderState(D3DRS_DEPTHBIAS, (DWORD*)&fDepthBias);
...
(아마 함수내부에서는 (float*)형으로 다시 형변환해서 값을 사용할 듯 합니다.)
-
수마 님// 맞습니다. float 형인 num이 저렇게 해서 한다고 형변환이 일어나지는 않겠죠. 끝에 있는 ";"가 그런 오해를 사게 한 것 같네요. 다른 함수에 넣거나 다른 변수에 넣거나 할 때 사용해야겠죠.(우선 ;는 지웠습니다)
그리고 보시면.. float형의 변수 num의 주소의 값을 int형 포인터로 바꾸어서 다시 그 주소의 값으로 바꾸는 것이기때문에 다른 형의 포인터로 값을 넘기는 것은 아닌 듯 하네요.(즉, 최종값은 포인터가 아니라 숫자값이겠죠.)
그리고 마지막 예는 왜 써주신 건지 좀 난감합니다. int형이 아니라 DWORD형으로 하면 괜찮다는 것을 말씀하시려는 것인지.. 문장 앞에 있는 "*"만 빼면 크게 달라보이지 않는 문장으로 보이는데요.
아직 제대로 확인은 안해봤습니다만.. 저렇게 읽은 값은 이상한 값이 될 듯은 하네요. 확인 해보도록 하겠습니다. -
수마 님// 확인해봤습니다. 수마님 말씀대로 값은 잘못된 값이 나옵니다.
된다길래.. '저게 된단말야?'하면서 그냥 올린게 실수네요. 확인해보지도 않고 올린 점 사과드립니다.
대신 새로운 소스를 올렸습니다. 분석해보시고 문제가 없는지 봐주시면 감사하겠습니다.
역시 테스트는 안해봤습니다.


zero2rss.php