프로그래밍 갤러리에서 놀고 있었는데(...) 흥미로운 떡밥 하나가 올라왔다.
나도 모르게 덥썩 물어버렸다(...)

문제의 코드는 이것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include 

int main(void)
{
float radius;
float area;

printf("원의 반지름 입력 : ");
scanf("%f", &radius);

area = radius*radius*3.1415;

printf("원의 넓이 : %f \n", area);

return 0;
}


글쓴이 말로는, VC++ 6 과 VS.net 2005 가 계산 결과가 다르게 나온다는 것이었다.
동강꺼랑 코드는 똑같애 12.0 입력했을 경우

내가 나온 값(VS.net 2005)은 452.376007
동강 나온 값(VC++6)은 452.376000

비슷한 문제를 GpgStudy 에서 찾을 수 있었다.
해결 방법 외에도 정확한 설명이 나와 있어서 기반 지식까지 쌓을 수 있었다.(물론 MSDN에 있는 내용... 이라지만 영어보다는 한글 설명이...^^;; 그리고 좀 덜 딱딱한 문체이기도 하고...)
@ assert의 버그?

답만 정리하자면, VC++ 6는 컴파일 옵티마이징 옵션중에 /Op (Improve Float Consistency)를 켜면 되고, VS 2008 은 기본이 /fp:precise (/Op를 대체) 로 되어 있어서 신경쓰지 않아도 된다.

이렇게 하면 위의 코드 실행 결과 VC++ 6 도 452.376007 이 나오게 된다.

자세한 것은 MSDN 자료를 참조하자.
vc++ 6 : http://msdn.microsoft.com/en-us/library/aa984742(VS.71).aspx
VS.net 2005~ : http://msdn.microsoft.com/ko-kr/library/e7s85ffb(VS.80).aspx

ps. 코드 하일라이트가 c/c++ include 태그 부분은 깔끔하지가 못한듯... 내가 잘못 쓴 건가...-_-;;
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Heart