대학교에서 배우는 수치해석에서 방정식의 근을 구하는 프로그램을 짜고 있습니다.
여기서 두 float 변수의 부호가 반대인지 아닌지를 아주 빠르게 찾고 싶습니다.
제일 간단한 방법은 누구나 생각할 수 있듯이
float a, b;
if( a*b < 0 )
이렇게 하는 방법입니다.
그런데 속도가 워낙 중요해서 다른 방법을 고안해보았는데요
float a, b;
if( (*(int*)&a) ^ (*(int*)&b) < 0 )
float하고 int는 저장방식의 특성 상, 맨 앞자리에 부호 비트를 갖는 공통점이 있습니다.
따라서 float이 저장 된 비트를 그대로 int형 변수라고 가정해도 부호는 변하지 않으니까 이렇게 변환 된 int를 서로 bit연산을 해서 답을 구하는 방법입니다.
결국 차이점은 위에건 두 실수의 곱 연산을 1회 수행하고, 아래건 캐스팅 2회와 bit xor연산(^) 1회를 수행하게 됩니다.
실수의 곱은 아주 느리다고 알고 있고.... bit연산은 아주 빠르다고 알고 있어서 한번 시도해보았는데요 아래거가 속도면에서 장점이 있을까요?
또 아래건 아무래도 저장방식의 특성을 이용하다보니 저장방식이 다른 머신에서는 사용하지 못하는 단점이 있는데요 이런 코드는 되도록 사용하지 않는게 바람직하다고 배웠는데 실용적인 부분에서 생각해도 사용의 여지가 없는 코드인가요?
마비노기 하시는 슨상님이시네
속도는 빠르고 돌아가면 장땡입니다
float, double의 부호는 msb만 달라진다고 합니다
msb = sign bit