Programming/기타 etc.

float 값의 비교 (== 연산자는 위험하다!)

매직블럭 2021. 4. 13. 11:29

일반적으로 값의 같음을 비교할떄 == 비교연산자를 사용한다.

 

실수 값의 비교에서도 아무생각없이 사용하는 경우가 많은데

실수의 같음 비교에 == 를 사용하는것은 매우 위험할 수 있다.

 

이는 float, double 과 같은 실수형 자료는 부동소수점 형태로 구현되어있어 발생하는 문제이다.

 

상식적으로는 0.1 + 0.2 == 0.3 이 수식이 틀릴 리 없는 숫자이지만

프로그램 관점에서는 값이 다를수 있다.

저 소수점 한참 아래의 오차값이 발생하기 때문이다.

 

이러한 문제를 해결하기위한 실수 비교 방법은 두가지가 있다.

 

1. 두 값의 차이를 이용한 방법

단순 비교연산자로 비교하는 방법이 아닌 두 값의 차이가 특정값(입실론으로 표현함) 이하일 경우 같은수로 판단

부동 소수점 표현의 특성상 나타나는 오차는 매우 작은 값을 가지므로 두 값의 차이가 매우 작은 값 이하라면

두 값은 같은 값이라 판단할 수 있다. 

이러한 기준이 되는 입실론의 크기는 사용하는 언어에 따라 각각 정의되어 있다.

단, 값의 대소관계를 모르기 떄문에 절대값을 취한뒤 크기를 비교한다.

 

 

2. decimal 형변환을 통한 비교

실수값을 decimal 로 형변환을 수행하면 고정소수점 방식으로 계산되어 오차를 개선할 수 있다.

이는 사용하는 언어에 따라 다를 수 있다.

 

 

이 외에도 fsum, round 등의 방법을 이용하여 보완할 수는 있지만 이들은 이들 나름의 문제점을 가지고 있어서

사용시 주의해야 한다.

 

 

사람의 기준에서는 오류가 없는 방법이지만

언젠가 크게 뒤통수 맞을 수 있는 위험을 가지고 있으니 기억해 두고 습관화 하는게 좋을것 같다.