처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.04.19 24

부동소수점을 == 로 비교해도 괜찮다고? 오해를 풀어주는 실용 가이드

Hacker News 원문 보기
부동소수점을 == 로 비교해도 괜찮다고? 오해를 풀어주는 실용 가이드

"부동소수점은 == 로 비교하면 안 된다"는 말, 정말 맞을까

개발을 배우다 보면 한 번쯤 이런 충고를 듣게 되죠. "float나 double은 절대 == 로 비교하지 마라, 항상 epsilon(작은 오차값)을 써라". 대학 수업, 스택오버플로 답변, 심지어 일부 린터 경고에서도 같은 말을 해요. 그런데 최근 한 그래픽스 엔지니어가 쓴 글이 이 상식에 정면으로 반박해서 관심을 끌고 있어요. 요지는 간단해요. "상황에 따라 == 비교는 완벽하게 정당하다."

그냥 반항심으로 하는 말이 아니라, 부동소수점이 실제로 어떻게 동작하는지 이해하면 "무조건 epsilon"이 오히려 버그를 만든다는 주장이에요. 하나씩 풀어볼게요.

부동소수점의 진짜 성질

먼저 부동소수점이 뭔지 잠깐 복습해볼게요. IEEE 754라는 표준에 따라 float(32비트)나 double(64비트)은 부호, 지수, 가수(mantissa)로 구성돼요. 소수를 2진수로 표현하다 보니 0.1 같은 값은 정확히 표현이 안 되고 0.10000000000000000555... 같은 근사치가 돼요. 그래서 0.1 + 0.2 == 0.3false가 나오는 유명한 현상이 생기죠.

하지만 같은 연산을 같은 입력으로 돌리면, 결과는 항상 비트 단위로 동일해요. IEEE 754는 이걸 보장하거든요. 즉 a = 1.0 / 3.0; b = 1.0 / 3.0;이면 a == b는 반드시 true예요. 이건 부동소수점이 "근사"라는 인식과는 별개로 결정론적(deterministic)이라는 뜻이에요.

== 가 정당한 대표 사례들

글쓴이가 드는 예시를 몇 개 살펴볼게요.

첫째, 캐시 키로 쓸 때. 어떤 함수 f(x)를 계산했고, 같은 x로 또 불렸을 때 재계산을 피하고 싶다면 "이전에 저장해둔 x와 현재 x가 같은가?"를 물어야 해요. 여기서 epsilon을 쓰면 오히려 틀려요. 약간 다른 입력도 "같다"고 판단해서 잘못된 캐시값을 반환할 수 있거든요. 비트 단위로 같은지를 묻는 게 정확해요.

둘째, 특수값 검사. x == 0.0으로 분모가 0인지 확인하는 건 완벽하게 올바른 코드예요. abs(x) < 1e-9 같은 검사로 바꾸면 실제로 0이 아닌 아주 작은 값도 0으로 취급해서 의도와 다른 결과가 나올 수 있어요. NaN(Not a Number, 계산 불가 값) 검사의 경우엔 아예 x != x라는 기괴한 관용구를 써야 하는데, 이것도 == 비교의 정당한 용례예요.

셋째, 단조함수의 출력 비교. 같은 입력에 같은 함수를 돌렸다면 결과는 항상 같아요. 테스트 코드에서 "리팩토링 전후의 결과가 동일한가?"를 검사할 때도 비트 단위 동등성이 오히려 강한 보장이 돼요.

그럼 epsilon은 언제 쓰나

반대로 서로 다른 경로로 계산된 결과를 비교할 땐 epsilon이 맞아요. 예를 들어 sin²(x) + cos²(x)는 수학적으론 항상 1이지만, 부동소수점 계산으론 0.9999999998 같은 값이 나올 수 있어요. 기하 연산에서 "두 점이 같은 위치인가"를 판단할 때도 마찬가지예요. 이때 epsilon을 쓰되, 고정된 값(1e-6 같은)보다는 값의 크기에 비례한 상대 오차(relative epsilon)를 쓰는 게 안전해요. abs(a - b) <= eps * max(abs(a), abs(b)) 같은 식이죠. 더 정교하게는 ULP(Units in the Last Place, 표현 가능한 가장 가까운 두 부동소수점 사이 거리) 단위로 비교하는 기법도 있어요.

핵심은 "무엇을 묻고 있는가"

결론은 이분법적으로 외울 게 아니라, 지금 내가 하는 질문이 뭔지 먼저 정리해야 한다는 거예요.

  • "두 값이 정확히 같은 비트 패턴인가?" → ==
  • "두 값이 수학적으로 거의 같은 실수인가?" → 상대 epsilon 또는 ULP 비교
  • "이 값이 특정 센티넬(0, 1, 특수 플래그값)인가?" → ==
  • "NaN이나 무한대인가?" → isnan(), isinf() 같은 전용 함수
이걸 구분 못 하고 무조건 epsilon을 쓰면, 정말로 0인지 체크해야 하는 코드가 잘못 동작하거나, 캐시 히트율이 떨어지거나, 테스트가 느슨해져서 버그를 놓치게 돼요.

업계 맥락: 게임, 금융, 과학 계산

게임 개발자들은 이미 이 감각을 잘 알고 있어요. 물리 엔진에서 "두 콜라이더가 정확히 같은 위치인가"는 epsilon, "충돌 이벤트 ID가 같은가"는 == 이런 식으로 구분하거든요. 반면 금융 쪽은 아예 부동소수점을 쓰지 않고 고정소수점(Decimal) 타입으로 계산해요. 0.1 + 0.2 문제가 돈 계산에서 나오면 치명적이니까요. 과학 계산용 라이브러리(NumPy, Julia 등)는 np.isclose() 같은 함수를 기본 제공하면서 상대 오차를 쉽게 쓰게 도와주죠.

한국 개발자에게 주는 시사점

코드 리뷰에서 "float에 == 쓰지 마세요" 같은 일반론적 지적을 받거나 주는 경우가 많은데, 한 번 더 들여다보세요. 비교의 의도가 "비트 동등성"인지 "수학적 근사 동등성"인지를 구분하는 게 더 프로페셔널한 리뷰예요. 특히 게임 서버, 시뮬레이션, GPU 연산, 머신러닝 추론 결정론성 검증 같은 영역에선 이 감각이 생존 기술이에요.

마무리

규칙을 외우기보다 기저의 동작 원리를 이해하는 것이 좋은 엔지니어의 자세라는 걸 다시 한번 느끼게 해주는 글이에요. "하지 마라"는 말 뒤에는 항상 "왜"가 있고, 그 "왜"를 알면 예외도 보이거든요.

여러분은 실무에서 부동소수점 비교 때문에 곤란했던 경험이 있나요? 어떻게 해결하셨는지 들려주세요.


🔗 출처: Hacker News

이 뉴스가 유용했나요?

TTJ 코딩클래스 정규반

월급 외 수입,
코딩으로 만들 수 있습니다

17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.

144+실전 강의
17개수익 모델
4.9수강생 평점
정규반 자세히 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.