2014-09-08 5 views
-2

나는 나의 출력이출력이 왜 그렇게 이상하다고 말할 수 있습니까?

0----2----4----6----8----1----1----1----1 

되고 싶어하지만 난

0----2---------------------------------- 

은 기본적으로 내가 0.4 단위로 16 0에서 계산하려는 점점 계속. 여기 내 코드입니다 :

int 
main(int argc, char *argv[]) { 
    double x; 
    for(x = 0.0; x<= 16.0; x = x + 0.4){ 

     if(fmod(x,2.0) == 0){ 
      if(x< 10){ 
       printf("%.0f",x); 
      } 

      if(x >= 10){ 
       printf("%.0f",x/10); 
      } 
     } 

     else{ 
      putchar('-'); 
     } 
    } 

    printf("\n"); 


    return 0; 
} 
+4

부동 소수점 정밀도 : fmod (x, 2.0) == 0 –

+0

답변을 얻은 후에 코드를 삭제하지 마십시오. 이것은 공개 Q & A 사이트이며 앞으로 다른 사람들에게 유용한 질문이되기를 바랍니다. –

+1

0.4는 이진 부동 소수점으로 표현 될 수 없기 때문에 정확한 2.0을 얻을 수 없습니다. http://stackoverflow.com/questions/588004/is-floating-point-math-broken http://stackoverflow.com/questions/5599912/what-do-floats-to-add-in-java는이 http://floating-point-gui.de/ [모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http : // docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

답변

1

귀하의 문제는 부동 소수점 정밀도 여기에 정확한 비교를 시도하기 때문이다 :

if (fmod(x,2.0) == 0) 

사용 어느 정수를, 또는 '엡실론'시험 사용

epsilon = 0.000001; 
if (fabs(fmod(x,2.0)) < epsilon) 
+0

필자는 엡실론을 사용했지만 현재는 4 개의 출력을 무시하고 있습니다 ---- 2 --------- 6- --- 8 ---- 1 ---- 1 ---- 1 ---- – Pyrons

+0

ty 나는 방금 모든 것을 10 배로 올리면서 int를 사용했습니다 – Pyrons

+0

당신은'fabs()'을 원하고'abs()'을 사용한다. – chux

관련 문제