while문에서 실수 관련해서 이해가 되지않는 부분이있습니다
조회수 691회
1.
#include <stdio.h>
int main(void){
double a,b;
scanf("%lf %lf",&a,&b);
while( a < b ){
printf("%0.2lf ",a);
a = a+0.01;
}
}
2.
#include <stdio.h>
int main(void){
int a,b;
scanf("%d %d",&a,&b);
while( a < b ){
printf("%d ",a);
a = a+1;
}
}
1번코드와 2번코드는 첫번째 숫자부터 두번째 숫자 그전숫자까지 출력하게 하는 함수를 만들려고한것인데요 첫번째 코드에 2.00 2.03 입력하면 2.00 2.01 2.02 2.03 가 나오고 두번째 코드에 0 3 입력하면 0 1 2 만 나오는데 둘다 똑같이 0.1 1 한개씩 더 해준건데 왜 위에는 2.03까지 나오고 아래는 2까지만 나오는거죠? 실수라고 뭐 특별한게 있는건가요?
2 답변
-
혹시나 싶어서 c double comparison으로 찾아보니 C에서 double형 자료들을 비교하는 건 어려운 일이라고 하네요.
double d1 = 13+0.2+0.2+0.1; /* 13.5 ? */ double d2 = 14-0.2-0.2-0.1; /* 13.5 ? */ if(d1==d2) { printf("They're the same %lf %lf\n",d1,d2); } else { printf("They're not the same %lf %lf\n",d1,d2); } # 출력: They're not the same 13.500000 13.500000
-
10진수 소수표현으로 1/3 을 한정된 소수자리수로 정확하게 표현할 수 없습니다. (0.333... 은 무한소수이니까.) 1/3 은 3진수 등으로 표현해야만 한정된 소수자리로 정확하게 표현이 가능하죠. (1/3 은 3진수로 0.1 즉 유한소수)
컴퓨터는 2진수 표현을 내부적으로 사용하기 때문에, 10진수 유한소수가 유한한 자릿수로 정확하게 표현(저장)할 수 없을 가능성이 있습니다. 이것이 부동소수점 형을 사용할 때 주의해야 하는 이유입니다.
댓글 입력