반응형

http://cafe.naver.com/dxgameprogramming/1443






http://cafe.naver.com/mathclub/84160



 

수학에서 봤을 때.. 무한 소수란 것이 있습니다.

예를 들어서

1/3 = 0.333333......

즉 3이 연속해서 나타나죠.

이 3은 끝없이 나타나기 때문에 무한소수라고 합니다.

 

컴퓨터에서는 아쉽게도 유리수형태의 수를 표현하는 자료형이 없습니다.

컴퓨터에서는 부동소수점(Floating point number)이란 자료형이 있죠.

 

부동소수점이라는 것은 소수점 위치를 옮겨서 잡는다는 뜻을 가지고 있습니다.

1.M 이란 소수가 있다면, 이 소수점 위치를 왼쪽 또는 오른쪽으로 지수부(E)로 옮기게 됩니다.

 

소수형태의 표현이므로 컴퓨터에서 표현할 수 없는 유리수들이 많겠죠.

 

컴퓨터는 이진수 체계를 가지고 있습니다.

그러다보니 컴퓨터에서 표현할 수 없는 유리수는 우리가 수학에서 사용하는 것보다 더 많습니다.

 

0.2  를 표현하고자 합니다.  이 수는 유한소수입니다만, 컴퓨터에서는 무한소수가 됩니다.

십진법 체계에서는 분모가 2 또는 5라는 소인수만 가져야죠?  왜냐하면 2x5 = 10 이기 때문이죠.

이진법 체계에서는 분모가 2라는 소인수만 가져야 합니다.  2는 소수이기 때문이죠.

 

0.2 를 이진법으로 표현할려면.. 무한소수가 됩니다.  왜냐하면 1/5 = 0.2 이기 때문에 분모에 5라는 소인수가 존재하죠.

0.2 를 이진법으로 표현할 때에는 정수부를 무조건 1로 만들어야 합니다.

0.2 * 8 = 1.6 이죠.  그럼 여기서 출발을 합니다.

1.6을 이진법으로 표현하면..

1.100110011001....

과 같이 소수부가 1001 이 반복하게 됩니다.  (너무나도 당연하겠지만 분모가 5이므로 4의 약수로 순환고리를 갖습니다.)

 

그런데 무한한 메모리를 가진 것이 아니기 때문에.. 소수부를 무한히 표현할 수 없습니다.

그래서 우리는 여기서 오차가 발생합니다.  이것을 Round off error 라고 하며, 우리말로 반올림 오차라고 합니다.

 

이 값은 하나의 숫자 상태에서는 중요하지 않습니다.  유효자리수 대비 2^-23 이라는 아주 작은 숫자(백만분의 1 오차)이기 때문이죠.

하지만 이 값에 숫자들을 곱하거나 더하거나 한다면 반올림 오차는 증가하게 됩니다.

 

프로그램을 할 때에는 이 반올림 오차에 대해서 충분하게 고려를 해주어야 합니다.

 

보통 부동소수점 연산에서는 == 을 사용하지 않습니다.  반올림 오차 때문이죠.

x == 0.0 대신에 우리는 x < 0.00001 && x > -0.00001 과 같이 합리적인 형태로 검사를 합니다.


반응형

+ Recent posts