Aug 04

VC++ 부동소수점 계산의 정확도를 높이는 방법

분류: Tip.Tech 태그: ,, , , Heart @ 10:48 오전

Trackback : http://dev.heartsavior.net/archives/164/trackback/

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

문제의 코드는 이것

#include <stdio.h>
 
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 태그 부분은 깔끔하지가 못한듯… 내가 잘못 쓴 건가…-_-;;

Leave a Reply