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 를 사용하세요...;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
32511 [질문]요새 피지알 관련 질문입니당. [9] 라임밍기뉴4130 07/10/26 4130 0
32510 [질문] 음악에 관심이 많으신 분 꼭 답변부탁드립니다. [4] 아임디퍼런트4438 07/10/26 4438 0
32508 디씨 카연갤의 명작. Dr.Stein이 완결됐습니다. [24] 겨울나기9333 07/10/26 9333 0
32506 [질문]대항해시대외전을 xp에서 실행할수 있는 방법이 있나요? [4] 라캉~9141 07/10/26 9141 0
32504 [Free BBS]소년이여, 이야기가 되어라-대선 그리고 게임 [7] 이카루스테란4726 07/10/26 4726 0
32503 5세트의 사나이들... [15] Story6136 07/10/26 6136 1
32500 [질문] 이공계 학생의 미래.. [62] MaxPower5740 07/10/25 5740 0
32499 [질문] 무한 디스..... [8] tongjolim4597 07/10/25 4597 0
32497 이쯤에서 보는 양대리그 4강 5회 이상 진출자 (조용호 기록 수정) [30] 리콜한방5069 07/10/25 5069 0
32496 [8배럭 이벤트] 1경기 승리팀의 최종 승리 확률은 ? [90] 메딕아빠4358 07/10/25 4358 0
32495 마재윤 VS 윤용태 3경기를 보면서.. [18] Kiling본좌6592 07/10/25 6592 0
32494 마재윤은 참.. (몇줄추가 21:00) [59] 죽는게더쉬워..8132 07/10/25 8132 0
32493 부장승진~!!! [11] SKY924505 07/10/25 4505 0
32492 스타챌린지는 왜 평점 안하나요? [9] 信主NISSI4320 07/10/25 4320 0
32491 @@ 프로리그 최고의 Closer 는 누구 ? [15] 메딕아빠4739 07/10/25 4739 0
32490 <질문>영어 이거 무지하게 쑥스럽습니다... [19] 엠케이3946 07/10/25 3946 0
32488 [Free BBS] 프로리그 경기 같이 보러다니실분, [10] 하양유저매냐3836 07/10/25 3836 0
32485 윤뇌제 vs 마과장.... [8] 프렐루드4594 07/10/25 4594 0
32484 [Free BBS]잠실 학생 농구장에 T1과 MagicNs 선수단 출현 [7] 정현준3988 07/10/25 3988 0
32483 [질문]MSL VOD 관련 [5] Adrenalin3972 07/10/25 3972 0
32481 [곰TV 3 윤용태vs마재윤] 뇌제냐? 마재앙이냐? [23] 점쟁이5522 07/10/25 5522 0
32480 가림토, 그를 사랑했던 팬이 보내는 안타까운 질책 [15] 스톰 샤~워4190 07/10/25 4190 0
32479 [질문]씨언어 문제좀 풀어주세요.. [8] 짱머거4360 07/10/25 4360 0
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로