부동소수점 오차 (Floating-Point Error)

수학
한 줄 정의: 컴퓨터가 실수를 유한한 자릿수의 이진수로 근사해서 표현함에 따라 필연적으로 발생하는 미세한 계산 오차다.

쉽게 풀면

컴퓨터는 무한히 많은 자릿수를 가진 실수를 정해진 개수의 비트만으로 표현해야 하기 때문에, 아무리 정밀해도 어쩔 수 없이 아주 작은 오차가 생긴다. 0.1처럼 간단해 보이는 소수조차 컴퓨터 내부에서는 정확히 표현되지 않고 근사값으로 저장된다. 이런 작은 오차들이 수많은 계산을 거치며 누적되면 예상치 못한 결과를 낳을 수 있어 수치 계산에서 항상 염두에 두어야 하는 문제다.

왜 중요한가

대규모 수치 시뮬레이션이나 딥러닝 학습처럼 수백만 번 이상의 연산을 반복하는 계산에서는 아주 작은 부동소수점 오차도 누적되어 결과의 재현성이나 수치적 안정성에 영향을 줄 수 있습니다. 그래서 전산학, 계산과학, 공학 시뮬레이션 분야의 논문은 사용한 자료형(단정밀도/배정밀도)이나 오차 허용범위를 명시해 결과의 신뢰도를 뒷받침하는 경우가 많으며, 이는 다른 연구자가 결과를 재현하거나 알고리즘을 비교할 때 중요한 판단 근거가 됩니다.

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

"누적된 부동소수점 오차로 인해 이론적으로 동일해야 할 두 계산 경로의 결과가 미세하게 달라졌다."

대규모 반복 계산이나 딥러닝 학습에서 부동소수점 오차의 누적은 재현성 문제나 수치적 불안정성의 원인이 될 수 있다.

"단정밀도 부동소수점 연산으로 학습한 모델과 배정밀도로 학습한 모델의 최종 손실값 사이에는 미세한 차이가 관찰되었으며, 이는 부동소수점 오차의 누적에 기인한 것으로 판단된다."

딥러닝 연구에서 연산 정밀도 선택이 학습 결과에 미치는 영향을 다룬 예이다.

"장시간 수행되는 유체 시뮬레이션에서는 부동소수점 반올림 오차가 누적되어 물리량 보존 법칙이 미세하게 위배되는 현상이 관찰되었다."

계산과학·공학 시뮬레이션 분야에서 장기간 반복 계산에 따른 오차 누적 문제를 다룬 예이다.

조금 더 깊게 보면

부동소수점 오차는 크게 표현 자체의 한계로 생기는 반올림 오차와, 크기가 매우 다른 두 수를 연산할 때 작은 값의 정보가 소실되는 자릿수 손실(catastrophic cancellation) 같은 현상으로 나눌 수 있습니다. 이런 오차가 얼마나 증폭되는지는 문제 자체의 민감도를 나타내는 조건수(condition number)와 밀접하게 관련되어 있으며, 조건수가 큰 문제일수록 같은 크기의 부동소수점 오차라도 결과에 더 큰 영향을 줄 수 있습니다. 따라서 정밀도 선택뿐 아니라 알고리즘 자체의 수치적 안정성을 함께 고려하는 것이 중요합니다.

주의할 점

부동소수점 수끼리 등호(==)로 정확히 같은지 비교하는 것은 위험하며, 일반적으로 작은 허용오차 범위 안에 있는지를 확인해야 한다.

관련 용어