대학교에서 배우는 수치해석에서 방정식의 근을 구하는 프로그램을 짜고 있습니다.

여기서 두 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연산은 아주 빠르다고 알고 있어서 한번 시도해보았는데요 아래거가 속도면에서 장점이 있을까요?

 

또 아래건 아무래도 저장방식의 특성을 이용하다보니 저장방식이 다른 머신에서는 사용하지 못하는 단점이 있는데요 이런 코드는 되도록 사용하지 않는게 바람직하다고 배웠는데 실용적인 부분에서 생각해도 사용의 여지가 없는 코드인가요?