부동 소수점 타입의 변수를 비교 연산할 경우 잘못된 결과가 나올 수 있습니다.
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
Need more help with this?
Don’t hesitate to contact us here.