2014-09-27 5 views
-1
#include <stdio.h> 

int main(void) 

{ 
    float c; 

    c = 4.7; 

    if(c == 4.7) 

    { 
     printf("Hello World"); 
    } 
    return 0; 
} 

문제는 float 데이터 유형과 관련이 있습니다. Hello world를 인쇄하려면 (float) 4.7 왜 사용해야합니까 ??형식 캐스팅없이이 코드에서 float 데이터 형식이 작동하지 않는 이유는 무엇입니까?

+4

숫자의 부동 소수점 표현이 부정확하기 때문에. 읽기 this http://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples – suspectus

+4

[어떻게 부동 소수점 값을 비교하는 것이 위험합니까?] (http://stackoverflow.com/questions/10334688/how-dangerous – user1336087

+1

[** 부동 소수점 안내 - 모든 프로그래머가 알아야 할 사항 ... **] (http : // 부동 소수점 부동 소수점 값) 안내서/). 문제는 당신이 생각하는 것을 비교하지 않는다는 것입니다. –

답변

4

4.7double이고, cfloat입니다. floatdouble을 비교하면 float이 먼저 double으로 변환됩니다. 따라서 if이 수행 중입니다. 4.7float으로 변환하면 정밀도가 떨어지고 그 수가 조금씩 바뀌었기 때문에 (double)(float)4.7 == 4.7이 거짓입니다.

if (fabs(f - 4.7) < 1e-10)과 같은 대략적인 비교를 수행 할 수 있습니다.

+1

또한 OP는 다음을 알아야합니다. 컴파일러는 아마도 '4.7'을'4.699999 ... '로 나타냅니다. 그래서'(float) 4.7! = (double) 4.7'입니다. 그러나 컴파일러는 '1'과 같이 다른 숫자를 정확하게 나타낼 수 있습니다. 그리고 OP의 프로그램은이 숫자들과 함께 타이 캐스팅하지 않고도 작동 할 수 있습니다. – HolyBlackCat

+1

'if (f == 4.7f)'가 올바르게 작동합니다. –

+0

예. 물론'4.7f == 4.7f'는 같은 정밀도를 가지고 있기 때문입니다. – HolyBlackCat

관련 문제