(기억을 더듬어가며 쓰는거라 설명이 정확하지 않을 수 있습니다. 참고자료들을 봐주세요.)

 

오랫만에 잡설 하나 적어둔다.

 

float 등 부동소수점 변수 연산을 하다보면, 처음에는 실수로 var1 == var2를 했다가 틀려먹는 경우가 잦아, 이를 확인해보면 소수점 저 밑 끝자리에 내가 적지도 않은 이상한 값이 묻어있는 경우가 종종 보이곤 한다.

 

해서, 검색하다보면 비교시에 (var == 0.0f) 가 아니라 (* 이게 되는 언어도 있긴하다) 다른 방법을 쓰라고 하는 경우가 많고, 이 어처구니없는 상태를  해결하고자 찾다보면 'epsilon' 이라는 변수/함수 등이 보이게 된다.

Epsilon Delta가 필요한 이유 . JS

 

Epsilon Delta, Epsilon은 일반적인 사용으로는 '수치 범위' 를 지정하기 위한 예약변수로 쓰기도 하는데,

 

보통은 ( var < Epsilon && var > -Epsilon )  와 같은 형식으로 비교하는 모습으로 쓰곤 한다.

 

이는, 부동소수점 연산의 특이사항때문에 사용하는것으로,

 

각 부동소수점 표현 포멧에 따라 '안전이 보장되는' 길이가 달라지는것을 인지하고, 이에 피해를 입지 않고자 (해당 증상을 '막는것'은 거의 불가능하다. 그럼 정밀도를 올려야하는데... 정밀도가 올라가면 연산 속도가 주르륵 떨어진다...) 추가하는 일종의 '상대 오차 반올림 값' (relative error unit roundoff, 일반적으로 쓰는 표현은 아닙니다.) 으로, 값을 보장할 수 없는 부분에서 반올림 등으로 근사값 처리를 해주기 위함입니다.

 

보통은 이를 프로그래머가 직접 만들기도 하지만 (만일 소수점 3번째 자리까지만 쓴다 => 4번째 자리나 5번째 자리에서 반올림 하겠다 등등?) 언어에 따라 이미 해당 값을 리턴해주는 함수가 존재하기도 합니다.

 

C++의 경우, limits 헤더의 numeric_limits 템플릿 클래스 안에 epsilon() 이라는 함수로 존재하며, 목적에 맞게 '거의 비슷한' 값을 비교 시에 사용하는 예시로 올라와 있습니다.

 

 

따라서...

 

이 값들을 이용함으로써 부동소수점 변수들에 대해 의미없는 오차 및 발생할 수 있는 문제들을 미연에 방지할 수 있게 된다... 는 점이 주요 포인트.

 

보통 부동소수점 연산이 많은 프로그램들에 경우에는, eplison delta 값을 이용하여 자체적으로 값을 비교해줄 수 있는 함수를 만들어 쓰곤 하는 편이다.

 

그게, 매번 ( var < Epsilon && var > -Epsilon ) 처럼 지저분하게 쓰는것보다는 좀 더 안전하고, '깔끔하게' 보일 수 있으니까. 

 

 

 

 

 

 

 

 

* 참고자료

1) https://en.wikipedia.org/wiki/(%CE%B5,_%CE%B4)-definition_of_limit

2) https://en.wikipedia.org/wiki/Machine_epsilon

3) https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon

4) https://gigglehd.com/gg/hard/5427559

+ Recent posts