[ 완료 ] For 반복문에 대해 여쭙습니다.

appler의 이미지

#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 레퍼런스 함수들 돌려보다가 이런 궁금증이 생겨 질문드립니다.

appler의 이미지

< 출처 : 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 <stdio.h>
 
 
int main(void)
{
    double x;
 
    for( x = -1; x < 1; x += 0.1)
    {
        printf("%5.1f\n", x);
        printf("%.19g\n", x);
    }
    return 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);

appler의 이미지

아...하~

감사합니다.

코드를 딱보니 바로 예전에도 같은 실수를 했던 기억이..-_-;;

하핫..
감사합니다..

농구를 좋아하시나요??


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);

appler의 이미지

ㅋㅋ 그렇군요..

닉네임에 서지훈이라고 되어있어서 하핫..

좋은 정보 감사드립니다.

공부가 되는군요..


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

jick의 이미지

float type에 0이 있기는 있습니다. 모든 bit가 0이면 진짜로 0입니다.

정확히 말하자면, 모든 bit가 0이면 +0이고, 최상위 비트(sign bit)만 1이면 -0입니다.

물론 float type으로 복잡한 연산을 수행할 때 그 결과가 수학적으로 0이 나와야 된다고 해서 위의 "진짜 0"이 꼭 나온다는 보장은 없죠.

appler의 이미지

진짜 0이 나온다는 보장은 없는거군요...

어쩌면 우리는 0인지 알수 없을 정도의 숫자를 가지고 0 이라고 하거나

진정한 0을 0이라고 부르지 못하고 있는건지도 모르겠군요.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

hayarobi의 이미지

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

=================
잠못자는 한솔아빠

appler의 이미지

정확한 설명 감사드립니다.

역시 KLDP에는 정보 공유가 실시간으로 이루어지니 정말 뿌듯합니다.

정말 감사합니다.

사실 저도 자료는 꽤나 모았지만 깊이 있는 공부를 하지 못한게 아쉽군요..

이제 깨달았으니

깨달음을 전하러 다녀야 겠군요..

사진은 아드님인가요?

무척 쾌활해 보이는군요..하하..


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.