일반적으로 값의 같음을 비교할떄 == 비교연산자를 사용한다.
실수 값의 비교에서도 아무생각없이 사용하는 경우가 많은데
실수의 같음 비교에 == 를 사용하는것은 매우 위험할 수 있다.
이는 float, double 과 같은 실수형 자료는 부동소수점 형태로 구현되어있어 발생하는 문제이다.
상식적으로는 0.1 + 0.2 == 0.3 이 수식이 틀릴 리 없는 숫자이지만
프로그램 관점에서는 값이 다를수 있다.
저 소수점 한참 아래의 오차값이 발생하기 때문이다.
이러한 문제를 해결하기위한 실수 비교 방법은 두가지가 있다.
1. 두 값의 차이를 이용한 방법
단순 비교연산자로 비교하는 방법이 아닌 두 값의 차이가 특정값(입실론으로 표현함) 이하일 경우 같은수로 판단
부동 소수점 표현의 특성상 나타나는 오차는 매우 작은 값을 가지므로 두 값의 차이가 매우 작은 값 이하라면
두 값은 같은 값이라 판단할 수 있다.
이러한 기준이 되는 입실론의 크기는 사용하는 언어에 따라 각각 정의되어 있다.
단, 값의 대소관계를 모르기 떄문에 절대값을 취한뒤 크기를 비교한다.
2. decimal 형변환을 통한 비교
실수값을 decimal 로 형변환을 수행하면 고정소수점 방식으로 계산되어 오차를 개선할 수 있다.
이는 사용하는 언어에 따라 다를 수 있다.
이 외에도 fsum, round 등의 방법을 이용하여 보완할 수는 있지만 이들은 이들 나름의 문제점을 가지고 있어서
사용시 주의해야 한다.
사람의 기준에서는 오류가 없는 방법이지만
언젠가 크게 뒤통수 맞을 수 있는 위험을 가지고 있으니 기억해 두고 습관화 하는게 좋을것 같다.
'Programming > 기타 etc.' 카테고리의 다른 글
[Git] github -> gitlab / repository를 이사하자 (0) | 2021.12.06 |
---|---|
[ROS] Rosbag2Video (0) | 2021.11.30 |
google drive web client 사용량 제한 (0) | 2021.02.25 |
pycharm 사용 및 환경설정 팁 (0) | 2019.03.18 |
폴더 내의 파일목록을 다뤄보자. 폴더 내 파일 리스트 만들기 (0) | 2015.12.17 |