우리가 일반적으로 실수를 표현하는데에는 여러 가지 방법이 있겠지만, 가장 일반적인 방법은 소수전개(decimal expansion)를 사용하는 것입니다. 그렇지만 이 소수전개에는 일정량의 반올림 오차를 포함할 수 있습니다.
소수전개는 다음과 같이 표현할 수 있습니다.
\[ x = n . d_1 d_2 d_3 … \]
여기서 n은 정수이고, 각 \( d_i \)는 0에서 9 사이의 숫자입니다. 물론 이것은 십진법에서 소수 전개입니다. 8진법이라면 0에서 7사이의 숫자이겠죠. 우리가 알고 있는 많은 실수들은 소수전개할 때 무한하게 이어집니다. 유리수의 경우에도 예외가 아닙니다. 일반적으로 컴퓨터에서는 2진법을 사용하고 있는데, 2진법의 경우 10진법의 유한 소수라 해도 무한 소수가 되는 경우가 많습니다. 0.1 는 10진법으로 유한소수이지만 2진법으로 무한소수가 됩니다.
컴퓨터에서 실수를 표현할 때에는 바로 이 2진법 소수전개를 사용하므로 주의할 필요가 있습니다. 한정된 기억공간에 실수를 표현할 경우 대부분의 경우 반올림 오차를 발생시킵니다. 이 반올림 오차는 덧셈, 뺄셈에서는 크게 문제가 되지 않지만, 누적 연산이나 곱하기 연산에서는 문제를 부각시킬 수 있습니다. 예를 들어서 3D 그래픽 프로그래밍에서 텍스처 해상도를 2의 멱승을 사용하는 것을 권하는 이유도 마찬가지입니다. 2의 멱승이 아닌 숫자로 1을 나누었을 때, 2진법에서는 예외 없이 무한소수가 되기 때문입니다. 다음 그림은 그러한 경우에 발생하는 예입니다. 체크 무늬의 텍스처가 깨지는 현상이 발생한 이유는 텍스처의 해상도를 56x56으로 했기 때문입니다.
앞에서 소수 전개된 숫자 x는 다음을 의미합니다.
\[ n + { d_1 \over 10 } + { d_2 \over 100 } + { d_3 \over 1000 } \le x \lt n + { d_1 \over 10 } + { d_2 \over 100 } + { d_3 + 1 \over 1000 } \]
실수는 우리가 사용할 수 있는 모든 수를 의미합니다. 그러나 정작 수가 아니면서 수로 취급하면서 사용하는 수가 있습니다. 복소수(complex number)라 하는데, 이 복소수의 일부는 실제로 사용할 수 있는 수가 아닙니다. 복소수는 어떤 수를 제곱해서 -1이 될 수 있는가라는 문제로부터 시작합니다. 실수안에서는 이 문제를 만족할 수 있는 수가 존재하지 않습니다. 그래서 허수를 정의하고 허수중 크기가 1인 수를 i 라고 합니다. 복소수는 일반적으로 z 라는 영문자를 이용하며, z = x + iy 형태의 숫자입니다. x, y 는 실수입니다. 수학에서 문제를 해결하는데에 복소수가 많이 사용되지만, 알고리즘에서 복소수의 영역을 가지고 설명할 것은 특별히 없습니다.
다음은 지수법칙입니다. 지수법칙에서는 양의 실수 b에 대해서 정의를 하도록 합니다. 지수법칙은 이미 친숙한 법칙이므로 자세한 설명을 하지 않아도 될 듯 합니다. (자세한 설명을 원하시면 댓글을 달아주시면, 보완해서 올려드릴께요.)
\[ b^0 = 1 \]
\[ for ~ n \gt 0, b^n = b^{n-1} b, ~~ for ~ n \lt 0, b^n = b^{n+1} /b \]
\[ b^{x+y} = b^x b^y , ~ (b^x )^y = b^{xy} ,~ b^{p/q} = \sqrt[q] {b^p} \]
마찬가지로 로그 법칙도 여기에 기재를 하도록 합니다.
\[ x = b^{\log_b x} = \log_b (b^x) \]
\[ \log_b (xy) = \log_b x +\ log_b y ~ (x \gt 0, y \gt 0) \]
\[ \log_b (c^y) = y \log_b c ~ (c \gt 0 ) \]
밑수가 2인 로그를 우리는 특별하게 lg 로 표현합니다. 지수가 밑수가 10인 경우에는 log 의 밑수를 생략할 수 있습니다. 또한 밑수를 변환할 때에는 다음과 같이 바꿀 수가 있습니다.
\[ \log_c x = { \log x \over \log c } \]
컴퓨터 알고리즘에서는 밑수가 2인 로그를 가장 많이 사용한다고 생각하시면 좋을 듯 합니다. 컴퓨터가 2진수를 사용해서가 아니라, 조건문 자체가 두가지 분기를 가지기 때문입니다. 실제 알고리즘에서는 사용하는 숫자의 진법과는 무관한 경우가 대부분입니다.
'Programming > Algorithm' 카테고리의 다른 글
Bitwise operation II (0) | 2011.09.22 |
---|---|
Bitwise operation I (0) | 2011.09.21 |
수, 거듭제곱, 로그 (0) | 2011.09.21 |
Induction II (0) | 2011.09.20 |
Induction I (0) | 2011.09.19 |
댓글