부동소수점 표현 (Floating-Point Representation)

컴퓨터과학·AI
한 줄 정의: 컴퓨터가 0과 1만으로 소수(小數)를 근사해서 저장하는 방식으로, 부호·지수·가수 세 부분으로 나누어 표현합니다.

쉽게 풀면

줄자로 길이를 잴 때 눈금이 촘촘한 구간과 성긴 구간이 있으면 어떤 값은 정확히 재지고 어떤 값은 반올림해야 하는 것처럼, 컴퓨터도 무한히 많은 실수를 유한한 비트(0과 1) 안에 다 담을 수 없습니다. 그래서 과학적 표기법(예: 1.23 × 10³)과 비슷한 방식으로 숫자를 "부호(+/-) × 가수(유효숫자) × 2^지수" 형태로 쪼개서 근사값을 저장합니다. 이 방식이 바로 IEEE 754라는 국제 표준으로 정해진 부동소수점 표현입니다. "부동(浮動, floating)"이라는 이름은 소수점의 위치가 지수에 따라 이리저리 움직인다는 뜻에서 왔습니다. 문제는 0.1처럼 간단해 보이는 십진수도 이진수로는 정확히 표현되지 않아 아주 작은 오차가 생긴다는 점입니다.

왜 중요한가

부동소수점 표현 방식과 정밀도 선택은 계산 결과의 정확도, 메모리 사용량, 연산 속도 사이의 근본적인 절충 관계를 결정합니다. 특히 대규모 딥러닝 모델 학습이나 과학 계산 분야에서는 어떤 정밀도(FP32, FP16, BF16 등)를 사용하는지가 학습 속도와 하드웨어 자원 소모, 최종 성능에 직접 영향을 미치기 때문에 논문에서 자주 명시적으로 다루는 요소입니다. 이 개념을 이해하면 왜 같은 알고리즘도 구현 방식에 따라 결과가 미세하게 달라지는지, 왜 특정 분야에서는 별도의 정밀 연산 방식을 쓰는지를 파악할 수 있습니다.

논문에서는 이렇게 쓰입니다

"모델의 가중치는 32비트 부동소수점 표현(FP32) 대신 16비트 반정밀도(FP16)로 저장하여 메모리 사용량을 절반으로 줄였다."

이 문장은 딥러닝 모델을 훈련하거나 배포할 때 숫자를 저장하는 비트 수(정밀도)를 낮춰서 계산 속도와 메모리 효율을 높였다는 뜻입니다. 정밀도가 낮아지면 그만큼 반올림 오차는 커질 수 있습니다.

"기후 모델의 장기 시뮬레이션에서는 부동소수점 표현의 반올림 오차가 누적되지 않도록 배정밀도(FP64) 연산을 채택하였다."

과학 계산 분야에서 오차 누적을 방지하기 위해 더 높은 정밀도를 선택한 예이다.

"혼합정밀도(mixed precision) 학습에서는 순전파와 역전파는 FP16으로 수행하되, 가중치 업데이트는 FP32로 유지하여 수치적 안정성을 확보하였다."

정밀도를 연산 단계별로 다르게 적용해 속도와 안정성을 함께 얻는 최근 딥러닝 학습 기법을 설명한 예이다.

조금 더 깊게 보면

IEEE 754 표준의 부동소수점 수는 부호, 지수, 가수 각각에 몇 비트를 할당하는지에 따라 표현 가능한 값의 범위와 정밀도가 달라지며, 예를 들어 FP16은 FP32보다 저장 공간은 절반이지만 표현할 수 있는 유효숫자와 범위가 좁아 오차와 오버플로우에 더 취약합니다. 이런 한계를 보완하기 위해 지수 범위는 FP32와 비슷하게 유지하면서 가수 비트를 줄인 BF16(bfloat16) 같은 대안적 형식도 딥러닝 하드웨어에서 널리 쓰입니다. 논문을 읽을 때는 저자가 어떤 정밀도를 사용했는지, 그리고 정밀도를 낮췄을 때 성능 저하를 어떻게 완화했는지(혼합정밀도 학습, 손실 스케일링 등)를 함께 살펴보면 결과 해석에 도움이 됩니다.

주의할 점

부동소수점 오차 때문에 프로그램에서 0.1 + 0.2를 계산하면 정확히 0.3이 아니라 0.30000000000000004처럼 미세하게 다른 값이 나올 수 있습니다. 이는 버그가 아니라 이진수와 진법변환 과정에서 생기는 근본적인 한계이며, 반복 계산이 누적되면 오차가 점점 커질 수 있으므로 금융 계산 등 정밀도가 중요한 분야에서는 별도의 처리 방식을 씁니다.

관련 용어