PGR21.com
- 경험기, 프리뷰, 리뷰, 기록 분석, 패치 노트 등을 올리실 수 있습니다.
Date 2007/10/25 01:26:21
Name 짱머거
Subject [질문]씨언어 문제좀 풀어주세요..
0부터 2까지의 실수를 0.1간격으로 출력하기 위해서 다음과 같이 프로그램을 작성 하였다.
for(x=0.0; x<=2.0; x=x+0.1)
printf("%f\n",x);

이 프로그램을 완전한 프로그램으로 만들어서 실행시켜 출력을 확인하고 어떠한 문제가 있는지 말하시오. 그리고 이 문제를 해결하도록 수정하시오


시험공부하다가 이런문제가 나왔는데 문제 답도 없구.. 미치겠습니다.
문제좀 풀어주세요..

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
마린이랑러커
07/10/25 01:27
수정 아이콘
일단 첫눈에 보이는건 데이터타입이 없나는거...
웨인루구니
07/10/25 01:34
수정 아이콘
#include<stdio.h>
int main()

for(float x=0.0; x<=2.0; x=x+0.1)
printf("%f\n",x);
return 0;
낭만테란
07/10/25 01:37
수정 아이콘
윗님 말씀대로 데이터타입만 있으면 충분히 잘 돌아갈겁니다.
짱머거
07/10/25 01:49
수정 아이콘
이게 책에는0.0부터 ~2.0까지 뜨게하는거라고 나와있는데
막상 돌려보면 1.9까지 바께 안뜨거든요.. 왜그럴까요
청바지
07/10/25 02:09
수정 아이콘
소수점에러가 발생한 경우인데요.. 2진표현으로 변환해서 컴퓨터는 저장을 하기 때문에. 0.1이 정확히 표현되지 않고. 0.999999 정도나 0.100001 같은 식으로 약간의 오차가 발생하게 됩니다. 아마 이 경우는 0.1보다 약간 크게 되었나 보네요. 그래서 0.1을 20번 더하면 정확히 2.0이 되지 않고, 2.00002 정도가 된다든지 해서.. 2.0은 출력이 안되는거죠.
과학계산할때는 매우 중요한 문제입니다.. 예기치 않은 에러를 발생시키거든요. 피해갈 수 없는 부분이기도 하구요.
float 형태로 for문을 돌릴 때는 약간 여유있게 해서, for(float x=0.0; x <= 2.01; x=x+0.1)과 같은 식으로 돌리면 무난해요~

어쩌면 double형을 float로 변환하는 과정에서 생긴 문제일 수도 있겠네요. %f는 float 출력할 때 쓰는건데, 0.0 2.0 0.1 이런 숫자들은 모두 double형태이죠. float로 표현하려면 0.0f 2.0f 0.1f같이 f를 붙여줘야 합니다.

그리고 여담입니다만, overclock을 심하게 하면 부동소수점연산결과 오차가 심해지는 일이 발생하기도 합니다.(그래도 다운되지는 않고 돌아갑니다.) 계산정밀도가 중요할 때에는 overclocking은 조심해서 하세요.
07/10/25 02:12
수정 아이콘
짱머거님// 원래 실수형인 float나 double은 정확한 값이 아니라 근사치입니다.
눈에 보이지는 않지만 아마 0.1을 계속 더하면서 x값이 2.0을 넘어 갔을 겁니다.
x<=2.0 -> x<2.1 로 고치시지요.
도라지
07/10/25 02:46
수정 아이콘
이건 x의 데이타 타입 선언문제가 아니라 for문에 정의되어 있는 상수들의 타입에 관한 문제 같네요.
07/10/25 16:11
수정 아이콘
정리해드리겠습니다.

먼저 데이터 타입 문제는 전혀 아닙니다 -ㅁ-
일단 저걸 실행하면 일반적 조건에서는 1.9 까지 됩니다. 왜냐면 소수점 에러.... 청바지님께서 이건 잘 설명을 해주셨는데;
청바지님이나 용용님께서 말씀하신 것보다는 보통 프로그래밍을 할 때(특히 계산기하학 계산할 때 아주 골치아픈 문제니...)
1e-8 와 같은 기계적 엡실론 상수를 잡아서 비교를 합니다. 위에서는 2+1e-8 로 써도 되겠네요.(1e-8 = 10^-8)

그래서 double나 float형을 비교할 때에는, x == y 가 아니라 fabs(x-y) < EPS 혹은 -EPS <= x-y && x-y <= EPS 이런식으로 하는 것이 좋습니다. 여기서 EPS는 1e-8이나 1e-9나 그떄그때 적당히 지정해 주셔도 되구요.

#define EPS 1e-8
for(x=0.0; x<=2.0+EPS; x=x+0.1)

아... 그리고 float 보다는 double과 %lf 를 사용하세요...;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
32743 프로리그 power ranking wk 6. [2] 파벨네드베드4789 07/11/08 4789 3
32742 엠히 팬 입장에서 본 프로리그 르까프전 경기 (07/11/07) [9] ls4419 07/11/08 4419 0
32741 4드론 퀴즈(3) - 정답발표 [21] 프렐루드4591 07/11/08 4591 0
32740 [명맵,명경기] 그 날의 감동을 다시 한번… #.4 데토네이션 : 최연성vs이윤열 [6] 점쟁이6115 07/11/08 6115 4
32739 오늘 MSL4강 마재윤vs박성균 [32] DodOvtLhs6727 07/11/08 6727 5
32738 [공지] 글 추천 기능 시범운영 안내 [20] anistar5235 07/11/07 5235 36
32737 [MGC2007] 박준우승과 리플 몇개 [9] 우리동네안드5799 07/11/08 5799 2
32736 [설탕의 다른듯 닮은] 김택용과 카카 [14] 설탕가루인형5782 07/11/07 5782 28
32735 올드에 대한 생각 [4] Axl4166 07/11/07 4166 1
32734 다음 스타리그는 제2의 올림푸스 스타리그 [20] 레모네이드4993 07/11/07 4993 0
32732 아.. 변길섭 선수.... [25] 아마프로5544 07/11/07 5544 1
32729 엔트리 예고제가 좋은 건가요? [46] 정테란5312 07/11/07 5312 1
32728 4드론 퀴즈(2) - 정답발표 [19] 프렐루드4266 07/11/07 4266 0
32727 [L.O.T.의 쉬어가기] 그대 이름은 임요환이로다 [7] Love.of.Tears.6465 07/11/06 6465 6
32726 [다른 게임 이야기] 그라나도 에스파다. 적은 혼노지에 있었다. [12] The xian5259 07/11/06 5259 0
32725 가끔은 나도 물량 나와! [21] 혀니7663 07/11/06 7663 1
32724 공군의 후기리그 첫 승을 축! 하! 드립니다! [46] Ntka6476 07/11/06 6476 0
32723 황제의물량! [49] 한참이지나도9654 07/11/06 9654 1
32722 꼭 봐야할 스타 명경기 - 베스트 Protoss vs Zerg 전 [41] 리콜한방6317 07/11/06 6317 0
32721 스타크래프트 2 Q&A 20번째 [9] Tail4725 07/11/06 4725 0
32720 [명맵,명경기] 그 날의 감동을 다시 한번… #.3 815 : 최연성vs오영종 [10] 점쟁이8043 07/11/06 8043 2
32719 고맙습니다. 최연성. [16] D.TASADAR7422 07/11/05 7422 0
32717 최연성 vs 김성기 [145] 잃어버린기억11635 07/11/05 11635 0
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기