Floating Point Equality 비교가 사실은 괜찮다고? 15년 경력 개발자가 뒤집은 상식
부동소수점 비교는 "절대 ==로 하면 안 된다"는 게 개발자 사이에서 거의 종교적 교리처럼 통용된다. 그런데 그 교리가 틀렸다면? floating point equality 문제를 다시 들여다보면, 우리가 진짜 싸워야 할 적은 따로 있다.
"엡실론 비교가 정답"이라는 신화의 균열
15년 이상 그래픽스·물리 시뮬레이션·기하학 코드를 작성해 온 개발자가 최근 흥미로운 주장을 내놓았다. 요지는 이렇다.
"15년 넘게 코드를 작성하면서 엡실론 비교가 실제로 좋은 해결책인 경우는 한두 번밖에 만나지 못했다. 거의 항상 더 나은 해결책이 존재했고, 엡실론 방식은 오히려 최악의 선택 중 하나였다." — 원문 저자
이 글이 Hacker News 상위권에 오른 것 자체가 의미심장하다. 개발자 커뮤니티에서 수십 년간 이어져 온 "부동소수점은 ==로 비교하지 말라"는 관행에 정면으로 도전하는 내용이기 때문이다.
저자의 핵심 논거는 간단하다. 부동소수점 연산은 불확실하거나 랜덤한 게 아니라 결정론적(deterministic) 이라는 것. IEEE 754 표준에 따라 단일 산술 연산은 "실제 정답에 가장 가까운 부동소수점 수"를 반드시 반환하도록 보장된다. 즉, 같은 입력이면 같은 출력이 나온다.
엡실론 비교의 세 가지 치명적 결함
저자가 지적하는 엡실론 비교의 문제는 세 가지로 요약된다.
1. 엡실론 값은 결국 "찍는" 것이다
bool approxEqual(float x, float y) {
return abs(x - y) < 1e-4f;
}
이 코드에서 1e-4f는 어디서 왔는가? 대부분의 경우 개발자의 직감이다. 프로그램의 한 부분은 맨해튼 거리 1e-4로 동등성을 판단하고, 다른 부분은 L-inf 거리 1e-6으로 판단한다. 이 두 기준이 충돌하면 어떻게 될까? 원문은 이를 "보름달이 뜬 밤에만 선 렌더링이 깨지는" 수준의 디버깅 지옥이라고 묘사한다.
2. 엡실론 비교는 추이성(transitivity)을 깨뜨린다
수학적으로 동등 관계는 추이적이어야 한다. A == B이고 B == C이면 A == C여야 한다. 엡실론 비교는 이를 보장하지 않는다. 정렬 알고리즘, 해시맵, 이진 탐색 등 수많은 알고리즘이 추이성을 전제로 설계되어 있다. 비추이적 비교를 넣으면 알고리즘이 쓰레기 결과를 내거나 크래시로 이어질 수 있다.
3. 여러 엡실론의 조합은 수학적으로 일관성이 없다
시스템이 커질수록 엡실론 비교는 여러 곳에 분산된다. 어떤 엡실론 조합도 전체 시스템의 논리적 일관성을 보장해 주지 않는다.
그렇다면 진짜 해결책은 무엇인가
저자의 처방은 단순하다. "왜 비교하는가?"를 먼저 물어라.
턴제 게임에서 유닛이 그리드 위를 이동한다고 하자. 이동 포인트를 부동소수점으로 관리하다가 0.1 + 0.2 != 0.3 문제에 부딪힌다면, 해결책은 엡실론 비교가 아니라 이동 포인트를 정수로 관리하는 것이다. 문제의 도메인 자체를 재설계하는 것이 정답이다.
저자가 제시하는 대안적 접근:
- 정수 산술로 전환: 게임 로직, 화폐 계산 등에서 소수점 이하를 정수로 스케일링
- 알고리즘 재설계: 비교가 필요한 이유를 역추적해 애초에 비교가 불필요한 구조로
x == y직접 비교: 같은 연산 경로를 거친 값은 비트 단위로 동일하게 나온다
마지막 포인트가 핵심이다. 동일한 코드 경로를 통해 계산된 두 부동소수점 값은 비트 단위로 동일하다. 예를 들어 캐시에 저장한 값을 다시 꺼내 비교할 때, 그 값이 동일한 연산으로 생성됐다면 ==는 완벽하게 작동한다.
금융·핀테크 시스템에서 이 문제가 더 심각한 이유
이 논쟁이 단순한 개발자 커뮤니티의 내부 토론으로 보일 수 있다. 하지만 내가 아시아-태평양 금융 시장을 취재하면서 목격한 사례들을 떠올리면, 이 문제는 훨씬 실질적이다.
핀테크 결제 시스템에서 부동소수점 정밀도 오류는 실제 돈 문제로 직결된다. 한국의 핀테크 플랫폼들이 연말정산 공제 계산을 자동화하거나, 실시간 환율 기반 환전 서비스를 운영할 때, 내부적으로 부동소수점 비교 로직이 어떻게 설계되어 있느냐는 단순한 코드 품질 문제가 아니다. 누적된 반올림 오차가 수백만 건의 거래에서 어떻게 전파되는지를 이해하지 못한 채 엡실론 비교를 임의로 삽입하면, 원문이 경고하는 "보름달 밤에만 터지는 버그"가 결제 시스템에서 발생할 수 있다.
금융 시스템에서는 정답이 명확하다. 화폐 단위는 정수로 관리하라. 원화라면 원 단위 정수, 달러라면 센트 단위 정수. 이것이 IEEE 754의 한계를 우회하는 가장 확실한 방법이다.
AI 시대, 이 문제는 새로운 차원으로 확장된다
흥미롭게도, 이 기술적 논쟁은 현재 AI 산업의 구조적 문제와 맞닿아 있다.
AI 모델, 특히 대형 언어 모델(LLM)은 내부적으로 수십억 개의 부동소수점 연산을 수행한다. AI 초음파가 FDA 승인을 받은 날: 의료 AI의 진짜 전쟁은 지금부터다에서 다뤘듯, 의료 AI가 실제 임상에 투입될 때 수치 정밀도는 생사의 문제가 될 수 있다. 관련 보도에 따르면 수백만 명의 미국인이 의사 대신 AI에 의료 상담을 받고 있고, 그 결과가 "심각하게 결함 있는 조언"으로 이어지는 사례가 보고되고 있다. 부동소수점 정밀도 문제는 이런 AI 시스템의 신뢰성 기반 중 하나다.
Nvidia의 GPU 아키텍처가 AI 연산의 표준이 된 것도 부분적으로는 부동소수점 연산의 정밀도와 처리 속도를 동시에 최적화했기 때문이다. 유럽 AI 칩 스타트업 Euclyd가 최소 1억 달러 펀딩을 추진하며 Nvidia 대안을 자처하는 상황에서, 이들이 넘어야 할 기술적 장벽 중 하나도 결국 부동소수점 연산의 일관성과 정밀도다.
개발자와 비개발자 모두를 위한 시사점
이 논쟁에서 얻을 수 있는 관점은 코드를 작성하지 않는 사람에게도 유효하다.
"관행이니까"라는 이유로 채택된 기술적 해결책은 종종 문제의 본질을 가린다. 엡실론 비교가 그렇다. 부동소수점이 "불확실하다"는 막연한 인식에서 출발해, 불확실성을 엡실론으로 감싸면 된다는 논리가 만들어졌다. 하지만 원문 저자가 정확히 지적하듯, 부동소수점은 불확실하지 않다. 결정론적이다. 문제는 우리가 잘못된 프레임으로 문제를 보고 있다는 것이다.
이는 AI 도입, 핀테크 시스템 설계, 의료 데이터 처리 등 모든 기술 의사결정에 동일하게 적용된다. 증상을 임시방편으로 덮는 대신, 왜 그 증상이 나타나는지를 먼저 물어야 한다.
David Goldberg의 고전적 논문 "What Every Computer Scientist Should Know About Floating-Point Arithmetic"은 이 주제의 가장 권위 있는 레퍼런스다. 원문 저자도 직접 인용하는 이 문서는, 부동소수점의 "결정론적 비결정성"을 이해하는 데 여전히 가장 명확한 출발점이다.
코드에서든, 비즈니스 의사결정에서든, "대략 맞으면 된다"는 엡실론 마인드셋이 쌓이면 결국 보름달 밤에만 터지는 버그가 된다. 정확한 질문을 먼저 던지는 것, 그게 전부다.
Alex Kim
Former financial wire reporter covering Asia-Pacific tech and finance. Now an independent columnist bridging East and West perspectives.
댓글
아직 댓글이 없습니다. 첫 댓글을 남겨보세요!