seegongsik
내 단어장
공업수학

컴퓨터는 수를 근사로만 안다

컴퓨터의 부동소수점 한계, 머신 엡실론과 반올림 누적, 치명적 상쇄와 조건수

지금까지 우리는 오차가 방법에서 온다고 봤어요. 걸음이 너무 크다, 차수가 너무 낮다. 그런데 그 모든 방법 아래에는 더 근본적인 한계가 깔려 있어요. 컴퓨터는 실수를 정확히 저장하지 못해요. 0.1 조차도요. 64비트 부동소수점은 약 15~16자리만 기억하고 나머지는 반올림해 버려요. 보통은 이 미세한 오차가 묻혀 안 보이지만, 거의 같은 두 수를 빼거나, 작은 오차를 수백만 번 쌓거나, 답이 입력에 민감한 문제(나쁜 조건수)를 만나면 갑자기 튀어나와요. 이 강은 수치해석의 바닥, 곧 컴퓨터가 수를 다루는 방식 자체와 거기서 새는 오차를 들여다봐요. 앞 강의 오차 바닥(roundoff floor)이 어디서 왔는지 그 정체예요.

수직선 위 눈금이 컴퓨터가 정확히 저장할 수 있는 수예요. 첫눈에 이상하죠. 0 근처는 촘촘한데 오른쪽으로 갈수록 성겨져요. 부동소수점은 유효숫자 몇 개에 지수를 붙여 수를 적기 때문이에요. 마치 과학적 표기법처럼요. 그래서 크기가 두 배가 될 때마다(옥타브 하나) 이웃한 표현값 사이의 간격도 딱 두 배가 돼요. 이 최소 간격을 ulp(units in the last place)라고 불러요. x 를 옮겨 보면 큰 수일수록 ulp 가 커지는 게 보여요. 큰 수는 거칠게, 작은 수는 곱게 저장된다는 뜻이에요. 모든 반올림오차가 여기서 시작해요.

그 간격이 실제로 얼마나 작은지 1 근처에서 재 봐요. ε = 2k 를 1 에 더하면서 k 를 점점 내려 보세요. 어느 순간 1+ε 가 그냥 1 이 돼 버려요. 더한 ε 가 1 위쪽 표현 간격의 절반보다 작아지면, 가장 가까운 표현값(1 자신)으로 반올림되기 때문이에요. 이 경계가 머신 엡실론, float64 에선 2⁻⁵² ≈ 2.2×10⁻¹⁶ 이에요. 약 15~16 유효숫자에 해당하죠. 이건 추상적인 얘기가 아니라 진짜 계산이에요. 컴퓨터에게 1 더하기 아주 작은 수는 그냥 1 일 수 있어요. 정밀도에는 바닥이 있다는 첫 증거예요.

오차 하나는 10⁻¹⁶ 수준이라 무시해도 될 것 같아요. 그런데 0.1 은 이진법으로 딱 떨어지지 않아서, 저장하는 순간 이미 아주 작은 오차를 품어요. 그걸 한 번 더할 때마다 오차도 조금씩 같이 쌓여요. 슬라이더로 더한 횟수를 늘려 보세요. 참값 n/10 에서 벌어지는 오차가 차곡차곡 커져요. 한 번엔 안 보이던 게 수백 번이면 또렷해지고, 시뮬레이션처럼 수십억 번 반복하는 계산에선 결과를 망칠 수도 있어요. 그래서 수치 프로그래머는 더하는 순서를 바꾸거나(작은 것부터), 보정 합산(카한 합) 같은 기법으로 이 누적을 다스려요.

가장 무서운 건 따로 있어요. 거의 같은 두 수를 빼는 거예요. (1−cos x)/x² 를 작은 x 에서 계산해 봐요. 참값은 x 가 작아질수록 0.5 로 가야 해요. 그런데 금색 곡선(곧이곧대로 계산)은 어느 순간 0 으로 무너져요. x 가 작으면 cos x 가 거의 1 이라, 1−cos x 가 유효숫자를 거의 다 잃어버리거든요. 앞자리가 다 같아서 지워지고, 믿을 수 없는 뒷자리만 남는 거예요. 이게 치명적 상쇄예요. 파란 곡선은 같은 값을 1−cos x = 2 sin²(x/2) 로 바꿔 계산한 거예요. 빼기를 아예 안 하니까 0.5 를 끝까지 지켜요. 수식은 같아도 계산 순서가 정밀도를 살리고 죽여요.

마지막은 오차가 아니라 문제 자체의 성격이에요. 연립방정식을 푸는 건 두 직선의 교점을 찾는 거예요. 두 직선이 시원하게 가로지르면 교점이 또렷하죠. 그런데 거의 나란하면? 한 직선을 머리카락만큼 흔들어도 교점이 저 멀리 휙 튀어요. 슬라이더로 기울기를 줄여 두 직선을 나란하게 만들어 보세요. 같은 10% 흔들림에 해가 점점 크게 움직여요. 이 증폭 배율이 조건수예요. 조건수가 크면(나쁜 조건) 입력의 작은 오차가 답에서 크게 부풀어요. 무서운 건, 이건 반올림오차와 달리 더 좋은 컴퓨터로도 못 고쳐요. 문제 자체가 예민한 거니까요. 그래서 좋은 수치해석은 안정한 알고리즘과 잘 조건된 문제, 둘 다를 챙겨요.

빠른 적용컴퓨터는 실수를 약 15~16 유효숫자로만 저장해요. 표현 가능한 수는 0 근처에 촘촘하고 클수록 성겨서, 간격(ulp)이 옥타브마다 두 배가 돼요. 1 과 구별되는 가장 작은 수가 머신 엡실론(float64 ≈ 2.2×10⁻¹⁶)이고요. 이 미세한 반올림오차는 보통 묻혀 있지만 세 가지 상황에서 튀어나와요. 작은 오차의 누적(시뮬레이션), 거의 같은 수의 뺄셈으로 인한 치명적 상쇄, 그리고 입력에 답이 민감한 나쁜 조건수. 앞 둘은 알고리즘을 안정하게 다시 짜서 줄이고(계산 순서·동등한 수식), 조건수는 문제 자체의 성질이라 더 좋은 컴퓨터로도 못 고쳐요. 수치해석의 두 기둥이 여기서 나와요. 안정한 방법을 고르고, 잘 조건된 문제로 바꾸기. 이게 모든 수치 계산의 바닥이에요.
공업수학
이 페이지가 도움 됐다면 후원하기