[ 완료 ] For 반복문에 대해 여쭙습니다.
글쓴이: appler / 작성시간: 목, 2008/05/22 - 10:16오전
#include <stdio.h> int main(void) { double x; for( x = -1; x < 1; x += 0.1) { printf("%5.1f\n", x); } return 0; }
위 코드를 실행했을때....
-_-;;;
-1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 -0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
이렇게 나오는군요......
저는 마지막에 0.9까지일거라 생각했는데 말이죠.....
아래는 정수형 변수로 돌려본 제가 명확하게 이해하고 있는 For문입니다.
#include <stdio.h> int main(void) { int x; for( x = 0 ; x < 10 ; ++x ) printf(" %d \n",x ); return 0; }
0 1 2 3 4 5 6 7 8 9
이렇게 나와서 제가 생각하기를
정수로 구성된 For문에서는 직관적으로 0부터 10미만이니깐 10개의 반복을 선언한다라고 알수가 있었는데
실수로 구성된 For문에서는 조금 다른 연산을 하는걸까요?
아니면 단순히 저의 착각일까요?
약간의 도움을 바랍니다..
C 레퍼런스 함수들 돌려보다가 이런 궁금증이 생겨 질문드립니다.
Forums:
이런한 조건인건데...왜 그럴까요??
< 출처 : win32 api 연구 사이트 >
for (초기식;조건식;증감식) 명령;
■ 초기식 : 반복문은 보통 특정 변수가 일정한 범위에 있는 동안에 실행된다. 이때 반복문을 통제하는 변수를 제어 변수라고 한다. 초기식은 제어 변수의 초기값을 지정하며 루프가 시작될 때 한 번만 수행된다. i=0 이나 count=3 같은 대입문의 형식을 가지는 것이 보통이다.
■ 조건식 : 반복문이 언제까지 실행될 것인가를 지정하며 이 조건이 참인동안 계속 루프를 돈다. 루프 실행을 계속할 계속 조건(탈출 조건이 아니라)이므로 조건이 거짓이 되면 루프를 탈출한다. 조건을 나타내므로 i < 10 또는 count < 100와 같은 제어 변수에 대한 비교 연산문이 온다. 조건문은 루프가 실행될 때마다 계속 평가된다.
■ 증감식 : 한 번 루프를 돌 때 제어 변수를 얼마나 증감시킬 것인가를 지정한다. i=i+1 같이 제어 변수의 값을 변화시키는 연산문이 온다. 루프가 한 번 실행될 때 증감식도 한 번 실행된다.
■ 명령 : 반복 실행될 명령이다. 하나의 명령이 올 수도 있고 { } 로 둘러싸인 복문이 올 수도 있는데 반복적인 처리는 보통 복문인 경우가 많다. 설사 루프에 포함된 명령이 하나뿐이더라도 실수 방지와 확장 편의성을 위해 가급적이면 { } 괄호를 싸 복문을 구성하는 것이 좋다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
아실지
아실지 모르겠지만...
컴퓨터에서 float type에서 우리가 아는 0은 없습니다.
0에 아주 가까운 값만이 존재 할 뿐...
이와 같은 맥락에서 아래 코드를 수행 해 보시면 위 현상을 쉽게 이해를 하실 겁니다.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
아...하~ 감사합니다.
아...하~
감사합니다.
코드를 딱보니 바로 예전에도 같은 실수를 했던 기억이..-_-;;
하핫..
감사합니다..
농구를 좋아하시나요??
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
농구는 고딩때
농구는 고딩때 쉬엄쉬엄 했었죠 ㅋ
그 후에는 알콜홀릭 ~ ㅎㅎ;
<어떠한 역경에도 굴하지 않는 하양 지훈'>
#include
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
ㅋㅋ
ㅋㅋ 그렇군요..
닉네임에 서지훈이라고 되어있어서 하핫..
좋은 정보 감사드립니다.
공부가 되는군요..
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
float type에 0이 있기는
float type에 0이 있기는 있습니다. 모든 bit가 0이면 진짜로 0입니다.
정확히 말하자면, 모든 bit가 0이면 +0이고, 최상위 비트(sign bit)만 1이면 -0입니다.
물론 float type으로 복잡한 연산을 수행할 때 그 결과가 수학적으로 0이 나와야 된다고 해서 위의 "진짜 0"이 꼭 나온다는 보장은 없죠.
진짜 0이 나온다는
진짜 0이 나온다는 보장은 없는거군요...
어쩌면 우리는 0인지 알수 없을 정도의 숫자를 가지고 0 이라고 하거나
진정한 0을 0이라고 부르지 못하고 있는건지도 모르겠군요.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
위 루프문만 가지고 쓰자면..
float에 정확한 1, 0, -1은 있는데, 정확하게 0.1을 갖는 값이 없기 때문입니다. 바이너리 세계에서는 수학적 개념으로 일치하는 소숫점 값은 2의 배수나 나눈 숫자들의 조합뿐입니다. (이것도 유효숫자 수준까지만이죠). 0.1의 근사값을 계속 더해나가기 때문에 정확한 1이 안 나옵니다. 비유를 하자면 컴퓨터 입장에서는 1/3을 계속 더하라고 하기 위해 분수 대신 0.333333이나 0.333334를 랜덤하게 더하라고 시키는 것과 같습니다.
위 for문에 덧셈을 0.5나 0.25같은 수로 했으면 예상했던 값이 그대로 나올 것입니다.
---------- 시그 *****
저도 세벌식을 씁니다.
M$윈도우즈, 리눅스, 맥 오에스 텐, 맥 오에스 클래식을 모두 엔드유저 수준으로 쓴답니다.
http://psg9.egloos.com
=================
잠못자는 한솔아빠
정확한 설명
정확한 설명 감사드립니다.
역시 KLDP에는 정보 공유가 실시간으로 이루어지니 정말 뿌듯합니다.
정말 감사합니다.
사실 저도 자료는 꽤나 모았지만 깊이 있는 공부를 하지 못한게 아쉽군요..
이제 깨달았으니
깨달음을 전하러 다녀야 겠군요..
사진은 아드님인가요?
무척 쾌활해 보이는군요..하하..
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
laziness, impatience, hubris
不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.
댓글 달기