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 를 사용하세요...;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
32479 [질문]씨언어 문제좀 풀어주세요.. [8] 짱머거4406 07/10/25 4406 0
32478 [잡담] 궁녀...덕분에 떠오른 수다. (스포일러?) [4] My name is J4165 07/10/25 4165 0
32477 [질문] 저그의 대 테란전 기본적인 빌드좀 가르쳐 주시면 안될까요? [8] EsPoRTSZZang4033 07/10/24 4033 0
32476 [질문]이번에 스타크래프트 리그를 기획하게 됐는데요. [9] 껀후이3778 07/10/24 3778 0
32475 [FreeBBS]ㅇㅇ/의 독백(4) - 현재형 인간 [2] ㅇㅇ/4037 07/10/24 4037 0
32474 [질문]포맷 도중 전원 꺼짐에 블루스크린 Hard error [5] DynamicToss4326 07/10/24 4326 0
32473 [질문]전학에관해 [8] 키스미3896 07/10/24 3896 0
32471 @@ 프로리그 최고의 Starter 는 누구 ? [11] 메딕아빠4628 07/10/24 4628 0
32469 몇몇 오락프로그램에 대한 잡답입니다. [37] 정테란4900 07/10/24 4900 0
32468 [Red]Nada....이제 부활입니다. [47] DarkSide5772 07/10/24 5772 0
32467 괴물이 힘이 없네요.... [25] 아마프로5401 07/10/24 5401 0
32466 가림토! 프로토스의 할아버지가 되어라 [43] 점쟁이6138 07/10/24 6138 0
32464 [yoRR의 토막수필.#36]여담. 두번째. [4] 윤여광4225 07/10/24 4225 0
32463 [질문]정확한 영어해석좀 해주세요 [16] 짱머거4300 07/10/24 4300 0
32461 [질문] 닥터왓슨 오류요~ [12] 라울리스타4303 07/10/23 4303 0
32460 오늘 수영장에 갔는데 왠 츠자가 ;;; [28] Eva0106633 07/10/23 6633 0
32459 여러분들의 뇌리에 남아 있는 역전 경기는 어떤게 있으신가요? [39] DEICIDE5495 07/10/23 5495 0
32458 [FreeBBS] 영화계 두 큰별이 다시 함께 하는군요. [10] 리콜한방4374 07/10/23 4374 0
32457 삼성전자 Khan.. Nostalgia [6] TaCuro4264 07/10/23 4264 0
32456 아 르까프 강하네요 [13] Akira4668 07/10/23 4668 0
32455 '팀플 본좌'의 몰락. [16] 잃어버린기억6661 07/10/23 6661 0
32454 한숨만 나오네요. [24] SKY925893 07/10/23 5893 0
32453 후와.. 이런 역전이 가능이나 한가요? [18] 벨리어스7180 07/10/23 7180 0
목록 이전 다음
댓글

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