2014.03.05 03:43
http://en.wikipedia.org/wiki/Fast_inverse_square_root
사실 애니메이션 본TM계산시 엄청나게 많이 쓰는데 당연한 얘기지만 각종 노말라이즈에 다 들어가는 수식이기 때문이가.
그런데 생각보다 속도가 느리다... 이를 최적화하는 기법.
최초 구현된 것은 ID의 Quake 3 Arena에서 존카멕 형이 만든 것. 아래의 소스 코드이다.
float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; }
아래는 언리얼4엔진에서 사용하고 있는 방법. SSE 를 사용하고 있다.
static FORCEINLINE float InvSqrt( float F )
{
static const __m128 fThree = _mm_set_ss( 3.0f );
static const __m128 fOneHalf = _mm_set_ss( 0.5f );
__m128 Y0, X0, Temp;
float temp;
Y0 = _mm_set_ss( F );
X0 = _mm_rsqrt_ss( Y0 ); // 1/sqrt estimate (12 bits)
// Newton-Raphson iteration (X1 = 0.5*X0*(3-(Y*X0)*X0))
Temp = _mm_mul_ss( _mm_mul_ss(Y0, X0), X0 ); // (Y*X0)*X0
Temp = _mm_sub_ss( fThree, Temp ); // (3-(Y*X0)*X0)
Temp = _mm_mul_ss( X0, Temp ); // X0*(3-(Y*X0)*X0)
Temp = _mm_mul_ss( fOneHalf, Temp ); // 0.5*X0*(3-(Y*X0)*X0)
_mm_store_ss( &temp, Temp );
return temp;
}
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
64 | 초간단 VTune 세팅법 [3] | 김도완 | 2005.06.16 | 1137 |
63 | [공지] 게시판 용도 | 김도완 | 2005.06.16 | 1178 |
62 | 파워맥에 들어가는 배터리 | 단장 | 2005.06.28 | 864 |
61 | 플래시 메모리 쉽게 끝내기 (1) | 단장 | 2005.07.04 | 855 |
60 | NOR-플래시 메모리 제어 (2) | 단장 | 2005.07.04 | 961 |
59 | 맥 탄생비화 (1) | 단장 | 2005.07.04 | 1177 |
58 | AMD CPU 리퍼런스 테이블 | 단장 | 2005.07.11 | 978 |
57 | CPU 평균온도 | 단장 | 2005.07.13 | 1087 |
56 | 음식 칼로리표 -_-;;; [3] | 단장 | 2005.07.14 | 1040 |
55 | Direct3D API들의 실행 사이클 | 단장 | 2005.07.15 | 988 |
54 | 순수 탄소 - 퓔러렌 | 단장 | 2005.07.19 | 989 |
53 | 오자서 평전 | 단장 | 2005.09.26 | 855 |
52 | 귤화위지의 고사 | 단장 | 2005.10.03 | 924 |
51 | 비싼 카메라 이야기 | 단장 | 2005.11.21 | 1000 |
50 | 니콜라 테슬라 | 단장 | 2005.11.26 | 1168 |
49 | 요요회사간의 베어링 규격 | 단장 | 2005.12.05 | 1084 |
48 | 원핸드 스트링 기본. 마운트. [1] | 단장 | 2005.12.05 | 1075 |
47 | 아마추어 암호 설계자에게 주는 충고 by 브루스 슈나이어 | 단장 | 2005.12.22 | 983 |
46 | 일어 12월명 [1] | 단장 | 2006.03.21 | 933 |
45 | VC 디버그빌드에서 들어가는 쓰레기값들의 의미 | 단장 | 2006.04.15 | 964 |