PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2012/11/15 00:52:48
Name deadbody
Subject 간단한 C언어 코드 질문입니다.(반복문)
메인함수의 반복문을 보면 x=0.4에서 반복문이 종료되어야 하는데 반복문 수행을 한번 더합니다...

그러니까 결과가
x=0.0000    블라블라
x=0.0500    블라블라
...
x=0.4000    블라블라   <----여기까지만 하고 끝나야 되는데
x=0.4000    블라블라   <---- 요게 한번 더 출력됩니다.


도대체 이유를 모르겠습니다. ㅜㅜ





#include "stdafx.h"
#include <math.h>

void Derivs(double x, double y, double* dydx) // 원함수의 1차도함수
{
        *dydx = -1000.*y+3000-2000.*exp(-x);
}

void Euler_exp(double x, double y, double h, double* ynew) // explicit 오일러법
{
        double dydx; //dydx 변수
        Derivs(x,y,&dydx); // 주어진 x값에서 1차미분을 구한다.
        *ynew=y+h*dydx; // 1차 테일러 급수로 값 추정
}

void Euler_imp(double x, double y, double h, double* ynew) // implicit 오일러법
{
        *ynew = (y+3000.*h-2000.*h*exp(-x-h))/(1+1000.*h);
}

int _tmain(int argc, _TCHAR* argv[])
{
        FILE *eu=fopen("euler.txt","w");
        double x0=0., xf=0.4, y0=0., h=0.05; // 근사하고자 하는 구간과 각 interval 길이
        double x=x0, y_ex=y0, y_im=y0, ynew_ex, ynew_im; //x,y(y는 두가지 방법 각각)
        int i=0;
        
        printf("i=%3d   x=%15.7e   y_ex=%15.7e   y_im=%15.7e \n", i,x,y_ex,y_im); fprintf(eu,"i= %3d   x= %15.7e   y_ex= %15.7e   y_im= %15.7e \n", i,x,y_ex,y_im);
        do{
                Euler_exp(x,y_ex,h,&ynew_ex); // expllicit, 다음 interval에서 y값 추정
                Euler_imp(x,y_im,h,&ynew_im); // impllicit, 다음 interval에서 y값 추정
                if(xf<x+h) h=xf-x; // 구간 끝점에 맞추기
                i++; x=x+h; y_ex=ynew_ex; y_im=ynew_im; // x_i+1, y_i+1 설정
                printf("i=%3d   x=%15.7e   y_ex=%15.7e   y_im=%15.7e \n", i,x,y_ex,y_im); fprintf(eu,"i= %3d   x= %15.7e   y_ex= %15.7e   y_im= %15.7e \n", i,x,y_ex,y_im);
        }while(x<xf); // 오일러법으로 근사점 구하는 반복문
        fclose(eu);
        printf("\n\n");


        return 0;
}

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
NO.6 Xavi
12/11/15 01:18
수정 아이콘
디버그해보니깐 x값이 i == 8 일때 0.3999999999997 이런식으로 나오네요
그래서 i == 9 일때 한번 더 돌아서 한번 더 찍히네요
deadbody
12/11/15 01:26
수정 아이콘
늦은 시간에 답변 감사드립니다!

혹시 i == 8 일때 0.3999999999997 나오는 이유가 뭔지 알 수 있을까요?
단순 계산으로도 저 값이 나올리가 없는 것 같고, x나 h나 유효숫자가 반올림오차 유발할 정도도 아니고
왜 오류가 나는지...

똑같은 코드에 xf=4 , h=0.5로 하면 또 제대로 i==8 까지 도네요
NO.6 Xavi
12/11/15 01:54
수정 아이콘
double형이 floating point로 계산하는 거라서... 어쩔 수 없이 오차가 발생할걸요. ㅠ_ㅠ 윗 분이 잘 설명 해주셨네요
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
152183 연애질문입니다. [6] 자르반4세1562 12/11/15 1562
152182 [LOL]실력이 줄어들었어요 [9] 얼음불꽃애니2091 12/11/15 2091
152181 나이스게임티비 15000원 정액제는 언제부터 가능하죠? [2] Paranoid Android1632 12/11/15 1632
152180 옵쥐 최저할부원금이 지금 얼마쯤하나요? [2] Fabregas1637 12/11/15 1637
152179 라그하임, 디오, 어썰트 해보셨던분? [13] 라리1598 12/11/15 1598
152178 온라인 쇼핑중에 상품이 없어지면 어떻게 알아봐야 할까요?? [3] 하이킹베어1421 12/11/15 1421
152177 갤텝팔점구 아센 어떻게올리나요? [3] Fabregas1555 12/11/15 1555
152176 대학교 1년 다니고 재수하신분 계신가요? [6] 롱리다3688 12/11/15 3688
152175 20대 중반 첫 정장 질문이요! [4] 망디망디1794 12/11/15 1794
152173 물건을 잘 잃어버리는 사람은 어떡해야 고칠 수 있을까요 [25] Practice14146 12/11/15 14146
152172 여성적인 남성들에 대해 질문... [3] 살다보니별일이2298 12/11/15 2298
152171 간단한 C언어 코드 질문입니다.(반복문) [5] deadbody2774 12/11/15 2774
152170 2NE1의 올해 성적을 어떻게 보시나요? [15] sprezzatura2070 12/11/15 2070
152169 드래곤플라이트) 연사 사냥 점수 질문~ [5] 등짝에칼빵1468 12/11/15 1468
152167 누구의 잘못일까요 [26] Paranoid Android2610 12/11/15 2610
152166 서울 이색카페 추천해주세요~ [1] 21727 12/11/15 1727
152163 롤 패치 이후 친창이 이상합니다. [3] 저그네버다��1666 12/11/14 1666
152162 군단의 심장 베타키 선착순 두분 가져가세요~! [4] sisipipi1528 12/11/14 1528
152161 sf 영화 추천 부탁드립니다. [16] Null1785 12/11/14 1785
152160 kt 계정을 설정하는 중에 오류가 발생했습니다. 다시 시도해 주세요 바나나배낭2303 12/11/14 2303
152159 6-70분 정도 길이의 초등학교 4-5학년이 볼만한 에니나 영화가 있을까요? [14] 스타카토1724 12/11/14 1724
152158 공무원 복지비(복지카드) 질문좀 할게요. [2] Art Of Life1879 12/11/14 1879
152157 갤스 공기계 6만원선이면 적당한가요? [8] 무제1618 12/11/14 1618
목록 이전 다음
댓글

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