inline void f2u( const float& f )
{
*(i32*)&f ^= *(i32*)&f >> 31 | ( 1 << 31 );
}
inline void u2f( const float& f )
{
*(i32*)&f ^= ~*(i32*)&f >> 31 | ( 1 << 31 );
}
흐린바다를 위해 작성한 수식.
float data[] 에 대해,
for( int i = 0; i < sizeof t / sizeof *t; ++i )
f2u( data[i] );
처럼 하면 float 의 값이 정수 기준 unsigned 오름차순 룰을 따르게 변경됨.
부호부, 지수부, (hidden bit) 가수부 의 규칙을 활용한 트릭.
같은 형식으로 u2f 를 사용하면, 오름차순 룰에서 정상적인 float 로 변경됨.
float 배열을 일반 radix sort 에 얹기 편하도록 작성한 것.
첫댓글 코세형은 개추야..
핵심은 IEEE 754 부동 소수점 표현은 정수 표현법으로 보았을 때 부호와 절대치(Sign and Magnitude) 방식에서 모티브를 얻은 것이기 때문에 2의 보수법을 쓰는 현대의 많은 시스템(x86 포함)에서 정수로써 대소를 비교하려면 변환이 필요하다는 거임.