부동 소숫점

작성

에 해커뉴스에 올렸던 글을 바탕으로 초벌 작성.

부동 소숫점(floating point)은 유효 자릿수를 일정 이하로 제한하여 실수를 근사하는 표현 방법이다. 이를테면 $\frac12$원주율(3.141592…)은 유효 자릿수가 십진법 네 자리로 제한되어 있으면 각각 다음과 같이 표현할 수 있다. $$ \frac12 = 5.000 \times 10^{-1} \qquad \pi \approx 3.142 \times 10^0 $$ 여기서 $\frac12$은 남는 자리에 0이 채워졌고, 원주율은 자리가 모자라서 소숫점 넷째 자리에서 반올림되었다.

부동 소숫점, 특히 IEEE 754 표준은 컴퓨터에서 실수 표현에 널리 쓰이며 아주 빠르게 계산할 수 있다. 고정 소숫점 표현과 비교할 때 부동 소숫점은 “통상적인 값”의 정밀도를 조금 희생하여 너무 작거나 너무 큰 “예외적인 값”을 쉽게 표현할 수 있다는 장점이 있다. 그러나 일반적인 수학 상식과 어긋나는 비직관적인 결과가 많이 나와 다루기 까다로운 자료형이기도 하다. 그러므로 부동 소숫점을 사용하기 전에는 항상 다음 질문에 답해야 한다.

두 가지 모델 #

옛날 글
Maybe the parent wanted to say that the result is detetministic and not far too off from the true value (in fact, as accurate as possible given the format). In the other words FP is exact but abides by a slight different calculation rule involving rounding.
해커뉴스에 쓴 글

부동 소숫점은 크게 두 가지 모델로 바라볼 수 있다. 첫번째는 특수한 법칙을 따르는 정확한 자료형이다. 이를테면 부동 소숫점 집합 $\mathbb{F}$ 안에서의 연산 $+_\mathbb{F}$ 등은, 실수 $x$를 부동 소숫점으로 반올림하는 함수를 $\mathbb{F}(x)$라 할 때 $a +_\mathbb{F} b = \mathbb{F}(a + b)$로 정확히 정의할 수 있다. $+_\mathbb{F}$는 일반적인 수학 연산 $+$과는 다른 규칙을 따르므로 새로이 규칙을 익혀야 한다. 예를 들어 일반적으로 $(a +_\mathbb{F} b) +_\mathbb{F} c \ne a +_\mathbb{F} (b +_\mathbb{F} c)$이므로 결합 법칙이 성립하지 않는다.

두번째는 예상 가능한 오차 범위를 지닌 근사 자료형이다. 부동 소숫점 연산의 오차는 항상 랜덤하다고 가정한 뒤 연산의 최대 오차를 나타내는 함수 $\epsilon_+(x, y)$를 써서, $a + b - \epsilon_+(a, b) \le a +_\mathbb{F} b \le a + b + \epsilon_+(a, b)$라고 취급하는 것이다. 즉 이 모델에서는 정확한 $a +_\mathbb{F} b$의 값은 알 수도 없고 알 필요도 없다.

어느 모델이 적합한지는 부동 소숫점으로 무슨 일을 하는지에 따라 다르다. 반올림 함수 $\mathbb{F}$는 기본적으로 계단 함수이기 때문에 수학적으로 다루기 대단히 귀찮다. 따라서 복잡한 계산의 오차를 분석할 때는 후자가 과잉 추정을 하긴 해도 훨씬 편리하므로 널리 쓰인다. 반면 계산이 비교적 간단하고, 연산 수를 줄이거나 오차를 줄이는 저수준 최적화가 필요할 경우 전자를 써야만 올바르게 분석할 수 있는 경우가 많다.

이름 #

부동 소숫점에서 “부동”은 소숫점이 고정되지 않고 떠 다닌다(浮動)는 뜻으로 쓰였지만, 움직이지 않는다(不動)거나 얼지 않는다(不凍)는 뜻의 동음 이의어가 더 널리 쓰여 전혀 그렇게 읽히지 않는 것이 현실이다. 둥둥 소숫점이라는 지나치게 직관적인 대안이 제시된 적이 있다.