float 값의 비교 (== 연산자는 위험하다!)
일반적으로 값의 같음을 비교할떄 == 비교연산자를 사용한다.
실수 값의 비교에서도 아무생각없이 사용하는 경우가 많은데
실수의 같음 비교에 == 를 사용하는것은 매우 위험할 수 있다.
이는 float, double 과 같은 실수형 자료는 부동소수점 형태로 구현되어있어 발생하는 문제이다.
상식적으로는 0.1 + 0.2 == 0.3 이 수식이 틀릴 리 없는 숫자이지만
프로그램 관점에서는 값이 다를수 있다.
저 소수점 한참 아래의 오차값이 발생하기 때문이다.
이러한 문제를 해결하기위한 실수 비교 방법은 두가지가 있다.
1. 두 값의 차이를 이용한 방법
단순 비교연산자로 비교하는 방법이 아닌 두 값의 차이가 특정값(입실론으로 표현함) 이하일 경우 같은수로 판단
부동 소수점 표현의 특성상 나타나는 오차는 매우 작은 값을 가지므로 두 값의 차이가 매우 작은 값 이하라면
두 값은 같은 값이라 판단할 수 있다.
이러한 기준이 되는 입실론의 크기는 사용하는 언어에 따라 각각 정의되어 있다.
단, 값의 대소관계를 모르기 떄문에 절대값을 취한뒤 크기를 비교한다.
2. decimal 형변환을 통한 비교
실수값을 decimal 로 형변환을 수행하면 고정소수점 방식으로 계산되어 오차를 개선할 수 있다.
이는 사용하는 언어에 따라 다를 수 있다.
이 외에도 fsum, round 등의 방법을 이용하여 보완할 수는 있지만 이들은 이들 나름의 문제점을 가지고 있어서
사용시 주의해야 한다.
사람의 기준에서는 오류가 없는 방법이지만
언젠가 크게 뒤통수 맞을 수 있는 위험을 가지고 있으니 기억해 두고 습관화 하는게 좋을것 같다.