2014-12-18 5 views
0

내가
코드가 좋아하는 C에서 부동 소수점 숫자 놀고 있었는데 오늘 :부동 번호

float a = 0.0; 
a += 0.8; 
if(a == 0.800000) 
    printf("correct"); 

문이 실행되지 않는 경우 이에 대한 나는 0.800000이었다 a의 값을 출력한다.

1correct2correct3correct4correct5correct6correct 

문 7correct 및 8correct가 인쇄되지 않는 :로

무효 메인() {

float a=0.0f; 

    a=a+0.1f; 


    if(a==0.1f) 
    printf("1correct"); 

    a += 0.1f; 

    if(a==0.2f) 
    printf("2correct"); 

    a += 0.1f; 

    if(a==0.3f) 
    printf("3correct"); 

    a += 0.1f; 

    if(a==0.4f) 
    printf("4correct"); 

    if(a==0.5f) 
    printf("5correct"); 

    a += 0.1f; 

    if(a==0.6f) 
    printf("6correct"); 


    a += 0.1f; 

    if(a==0.7f) 
    printf("7correct"); 


    a += 0.1f; 


    if(a==0.8f) 
    printf("8correct"); 

} 

다음 프로그램의 인쇄 출력.

하나만 설명해주세요.

+0

if (fabs (a-0.800000) <1e-6) printf ("correct"); – aerokite

+0

모든 프로그래머는 부동 소수점 숫자가 항상 합산되지 않는 이유에 대해 [이 간단한 안내서] (http://floating-point-gui.de/)를 읽어야합니다! – Icemanind

+0

[부동 소수점 연산이 깨졌습니다.] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken)? –

답변

-1

최대 오류 값으로 인해 부동 소수점 숫자의 정밀도가 떨어질 수 있으므로 작은 범위와 동등성을 확인해야합니다.

자세한 내용은 herehere을 참조하십시오.

+0

내가 downvoted되지 않도록 답변을 어떻게 개선해야합니까? 감사! –

-1

한정된 수의 2 진수로 정확하게 표현할 수없는 많은 십진수가 있습니다.

일반적으로 플로트 또는 복식을 테스트하여 정확한 일치 여부를 확인하는 것은 좋지 않습니다. 당신이 정말로 그들을 테스트 할 경우, 작은 범위 내에서 적합 확인 : 당신이 가능하게 정수가 아닌 수레 또는 복식을 사용할 수 있습니다 때마다

if (a > 0.799999 && a < 0.800001) 
    printf("correct"); 

는 이렇게. 예를 들어 루프 카운터 나 배열 인덱스에 float을 사용하지 마십시오.

실제 현상을 모델링하고 날씨를 예측하는 등의 부동 소수점에는 많은 장점이 있지만 부동 소수점에는 많은 미묘한 차이가 있습니다.