2017-01-24 9 views
1

float 값을 비교할 때 예기치 않은 동작이 발생합니다. 부동 소수점 문제를 반올림 할 수 있지만이 숫자는 매우 구체적입니다.float 값을 비교할 때 예기치 않은 동작이 발생합니다.

#include <stdio.h> 
int main() 
{ 
    float alpha = 0.0f; 
    int finish = 0; 

    while (finish == 0) 
    { 
     alpha += 0.05f; 

     if (alpha > 1.0f) 
     { 
      printf("%f", alpha); // Expected result: 1.05f, actual result: 1.0f 
      finish = 1; 
     } 
    } 

    return 0; 
} 

실제로는 alpha = 1.0f 일 때 조건이 입력됩니다. 그 행동을 이해할 수 없다. ...

나는 윈도우 10 (32 비트 및 64 비트에서 테스트 됨), 인텔 i5 프로세서에서 MinGW (GCC 5.3.0)로 컴파일 중이다.

+3

'printf ("%. 7f \ n", alpha);'와 같이 유효 숫자가''alpha ''인 경우 다음과 같이 즉시 문제를 볼 수 있습니다 : http://ideone.com/zwQW7e . –

+1

0.05f의 상수가 정확히 0.05를 나타내는 무한 비트 스트림보다 약간 작거나 약간 큰지 알아야합니다. 아마, 그것은 약간 더 클 것입니다. –

+0

이것 (내가 내 대답을 짓기 위해 사용했던 것)을 확인해보십시오. http : //www.exploringbinary.com/floating-point-converter/ – Bathsheba

답변

2

(IEEE754 부동 소수점 수있는 경우 대답 제한).

float0.05으로 존재하지 않습니다. 그에 가까운 번호 표현할 수는

0.0500000007450580596923828125

입니다

그래서 무슨 일이 일어나고 있는지입니다 당신이 오버 단지 푸시을 충분히입니다 alpha에 추가 생각보다 약간 큰 값 (관심에서, 정확히 표현 될 수 있습니다.) 1.0f마르크 print의 기본 형식은 약간 큰 것을 반올림됩니다

1.0f보다 숫자가 1.0f입니다.

요약하면이 모든 것은 이진 부동 소수점이 일반적으로 정확한 십진수 표현을 갖지 않기 때문입니다.

+0

나는 OP가 복제물을 연구하도록 권고 받았지만 동의하지 않습니다. 부동 소수점 지식으로 무장 한 경우에도이 특별한 경우에 대한 설명이있는 것이 좋습니다. (가치가있는 부분에 대해서는 아마도 2 ~ 3 개의 부동 소수점 질문을 주당 확인 된 질문과 중복으로 닫을 것입니다.) – Bathsheba