부동 소수점 타입의 변수를 비교 연산할 경우 결과가 다르게 나오는 문제

수정일 Tue, 13 Jul 2021 시간: 04:28 PM

부동 소수점 타입의 변수를 비교 연산할 경우 잘못된 결과가 나올 수 있습니다. 

int main()
{
    float x = 0.03f;
    float y = 0.1f;
    y += 0.06;
    y += 0.01;
    if (x == y)
        printf("x == y\n");
    else
        printf("x != y\n");
}


위 예제는 부동 소수점을 비교할 때 발생하는 알려진 이슈로 x와 y를 비교 연산한 결과가 false가 나오는 경우가 대표적인 예 입니다.
해당 이슈는 도구의 버그가 아니라 도구가 일부 부동 소수점 비교 연산을 직접 하는 경우 발생할 수 있는 버그를 발견한 이슈로 보셔야 할 것 같습니다. 

int compareValues(float val1, float val2){
  float diff = val1 - val2;
  float tolerance = 0.0001f;
  int result = 0;
  if (diff < tolerance){
    result = 0;
  }else {
    result = 1;
  }
   return result;
}
int main()
{
    float x = 0.03f;
    float y = 0.1f;
    y += 0.06;
    y += 0.01;
    if (compareValues(x,y) == 0)
        printf("x == y\n");
    else
        printf("x != y\n");
}


이러한 경우 위 예제와 같이 간단한 비교 함수를 작성하여 오차 허용 범위 내에서 값을 비교하여 해결할 수 있습니다.

자세한 내용은 아래 링크를 참조 부탁 드립니다.
https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://devmachine.blog.me/220119534107

자세한 방법은 Controller Tester Troubleshooting Guides를 참고해주세요.


아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.