|
최근에 gcc로 프로젝트를 개발하고 있는데 NaN(Not a Number)라는 것이 나와서 속을 썩이고 있습니다. 현재 여러가지로 샘플을 만들어서 테스트하고 있는데요.
컴파일러의 최적화 옵션에 따라서 결과가 다르게 나와서 문의를 합니다.
아래는 간단한 코드입니다.
unsigned int *pa;
float t = 3.14;
pa = (unsigned int *)&t;
*pa = 0xffffffff; /* t를 강제적으로 NaN으로 만들어 줌 */
printf("t is %le\n", t);
printf("t is %le\n", t);
if( t != t )
printf("t is %le\n", t);
원래 생각했던 데로 하면
t is NaN
t is NaN
t is NaN
이렇게 나와야 합니다. gcc에서 컴파이러 옵션을 -O0 또는 -O1을 주면 이렇게 나옵니다.
그렇지만 좀 더 높은 최적화 수준인 -O2 또는 -O3 를 주면
t is 3.140000e+00
t is NaN
t is NaN
이렇게 나오네요.
제가 생각하기에 *pa = 0xffffffff 하는 것이 t의 값에 영향을 주지 않는다고 최적화해버려 처음 printf 문에서는 기존 캐쉬에 가지고 있던 것을 찍는 것 같고 그러면서 t의 값을 업데이트해서 다음 printf 문에서는 정상적으로 찍는 것 같습니다.
현재는 -O2로 컴파일 하고 있는데 계속 -O2로 컴파일하면서
t is NaN
t is NaN
t is NaN
이렇게 나오게 하고 싶습니다. 어떻게 해야 할까요?
|