털털한 개발자, 긔저기의 개발공간

게임을 개발하다 보면 float을 사용할때가 정말로 많다.

 

하지만 float의 계산이 오차가 있기 때문에 항상 조심해서 사용해야 한다.

 

4byte 변수안에 소숫점까지 다 표현해야하고 일반적인 정수형 변수의 계산이랑은

 

다르기 때문에 꽤 많은 상황에서 오차가 생기곤 한다

 

(부동소수점은 IEEE 754 표준을 사용한다)

https://ko.wikipedia.org/wiki/IEEE_754

 

IEEE 754 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. IEEE 754는 전기 전자 기술자 협회(IEEE)에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다. ±0 등의 수와 무한, NaN 등의 기호를 표시하는 법과 이러한 수에 대한 연산을 정의하고 있다. 가장 최신 버전인 IEEE 754-2008은 IEEE 754-1985와 IEEE 754-1997을 대부분 포함한다. IEEE 754에는 32 비트 단정도(single-precision), 64 비트 배정

ko.wikipedia.org

예를 들어 적에게 총알을 맞아서 hp가 깎이는 경우라고 생각했을 때

 

적의 체력은 10, 총알의 데미지는 2라고 생각해보자

 

그렇다면 10-2 = 8의 체력이 남아야 되는데 오차때문에 7.99999 등의 숫자가 나오기도 한다.

 

이게 반복이 되면 밑의 사진과 같은 숫자가 출력되는 것이다....

 

float 오차

2.38...E-07이면 0.0000xxx 등의 아주 작은 값이다.

 

그러나 이 값도 어떻게 보면 0보다 큰 값이기 때문에 

 

조건

이런 조건에서 걸리지 않게 된다... 즉 5발을 맞아야 죽는 적이 6발을 맞아야 죽는 경우가 생긴다는 말씀!

 

 

 

이를 해결하는 방법은 여러가지가 있지만 나는 반올림을 이용해 해결했다.

 

 

반올림 해결법

 

float 값에 사용하는 자리수 * 10을 곱해서 반올림을 한다. 나는 0.x 번째까지 사용하므로 10을 곱했다.

 

그런다음 반올림을 하고 다시 사용하는 자리수 / 10을 해주면 완료!

 

반올림을 하기 때문에 작은 값도 남지않아 제대로 비교를 할 수 있다!