Aug 04 2008
VC++ 부동소수점 계산의 정확도를 높이는 방법
프로그래밍 갤러리에서 놀고 있었는데(…) 흥미로운 떡밥 하나가 올라왔다.
나도 모르게 덥썩 물어버렸다(…)
문제의 코드는 이것
#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; } </stdio> |
글쓴이 말로는, VC++ 6 과 VS.net 2005 가 계산 결과가 다르게 나온다는 것이었다.
동강꺼랑 코드는 똑같애 12.0 입력했을 경우
내가 나온 값(VS.net 2005)은 452.376007
동강 나온 값(VC++6)은 452.376000
비슷한 문제를 GpgStudy 에서 찾을 수 있었다.
해결 방법 외에도 정확한 설명이 나와 있어서 기반 지식까지 쌓을 수 있었다.(물론 MSDN에 있는 내용… 이라지만 영어보다는 한글 설명이…^^;; 그리고 좀 덜 딱딱한 문체이기도 하고…)
답만 정리하자면, 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 태그 부분은 깔끔하지가 못한듯… 내가 잘못 쓴 건가…-_-;;
