# Half‑Life 2에서 문 하나가 만든 “부동소수점 정밀도 버그” – 초보자를 위한 쉬운 해설

---

# # 서론: 게임 안에서 사라지는 문, 왜 일어났을까?

많은 게이머가 **Half Life 2**를 플레이하면서 “문을 열었는데 갑자기 캐릭터가 벽을 통과한다**는** 이상한 현상을 경험한 적이 있나요?**

이 현상은 단순히 그래픽 오류가 아니라 **부동소수점(FP) 정밀도** 문제에서 비롯된 **버그**입니다.

이번 포스트에서는 해당 버그가 어떻게 발생했는지, 왜 **부동소수점 정밀도**가 게임 프로그래밍에서 중요한지, 그리고 비슷한 문제를 예방하기 위한 기본 원칙을 초보자도 이해하기 쉽게 풀어보겠습니다.

> 👉 자세한 원본 토론은 [Reddit - A bug caused by a door in Half Life 2](https://reddit.com/r/programming/comments/1p4kf9a/a_bug_caused_by_a_door_in_a_game_you_may_have/)에서 확인할 수 있습니다.

---

# # 본론

## # 1️⃣ 부동소수점이란? – 컴퓨터가 실수를 다루는 방식

- **정의**: 부동소수점은 실수(소수점 이하가 있는 수)를 근사값으로 저장하는 방식이며, IEEE 754 표준이 가장 널리 쓰입니다.

- **정밀도 차이**: 32비트(`float`)와 64비트(`double`)는 각각 약 7자리·15자리까지 정확히 표현합니다.

- **오차 누적**: 연산을 반복하면 작은 오차가 쌓여 눈에 띄는 차이가 생깁니다.

게임에서는 수많은 물리 연산과 충돌 판정이 실시간으로 일어나기 때문에 **오차가 누적**되면 **예상치 못한 위치 이동**이나 **충돌 실패**가 발생합니다.

## # 2️⃣ Half Life 2 버그의 구체적 원인

| 단계 | 설명 |

|------|------|

| **문 위치 초기화** | 문 오브젝트는 세계 좌표계에 `float` 값으로 저장됩니다. |

| **플레이어와 문 충돌 판정** | 엔진은 플레이어와 문 사이 거리를 `float` 연산으로 비교합니다. |

| **문이 열릴 때 좌표 변동** | 문이 열리면서 회전값이 추가되는데, 회전값을 라디안으로 변환하면서 **미세한 부동소수점 오차**가 발생합니다. |

| **오차 누적** | 문이 여러 번 열리고 닫히면 오차가 누적돼 실제 문 위치와 엔진이 인식하는 위치가 **수밀리미터 차이**까지 벌어집니다. |

| **충돌 판정 오류** | 플레이어가 문 근처에 있을 때 엔진은 “문이 아직 닫혀 있다”고 판단해 **충돌을 무시**하고, 결과적으로 캐릭터가 벽을 통과하거나 뜨는 현상이 나타납니다. |

핵심은 **문을 회전시키는 과정에서 발생한 부동소수점 정밀도 손실**이 **충돌 판정 로직**에 영향을 미친 점입니다.

## # 3️⃣ 초보 개발자를 위한 예방 팁

1. **가능하면 `double` 사용**

   - 물리 연산이나 중요한 좌표 계산에서는 `float`보다 `double`을 쓰면 정밀도가 크게 향상됩니다.

2. **오차 보정(Epsilon) 적용**

   - 두 값이 “같다”는 판단을 할 때 `|a - b| < ε` 형태로 작은 허용 오차를 두어 부동소수점 오차를 무시합니다.

3. **정수 기반 좌표 시스템 도입**

   - 일부 엔진은 **고정소수점(Fixed‑point)** 방식을 사용해 정밀도 문제를 근본적으로 차단합니다.

4. **주기적인 재정렬(Reset) 로직**

   - 문처럼 반복적으로 움직이는 오브젝트는 일정 주기마다 **원본 좌표**와 **회전값**을 다시 계산해 오차를 초기화합니다.

## # 4️⃣ 부동소수점 정밀도가 게임 산업에 미치는 영향

- **물리 엔진**: 정확한 충돌, 중력, 반동을 구현하려면 미세한 오차가 치명적일 수 있습니다.

- **네트워크 동기화**: 클라이언트와 서버 간 좌표 차이가 커지면 **텔레포트 현상**이 발생합니다.

- **그래픽 렌더링**: 카메라 위치가 부정확하면 **Z‑fighting**(깊이 버그)이 생깁니다.

따라서 **부동소수점 정밀도**는 단순히 수학적 개념을 넘어, **게임 품질과 플레이어 경험**을 좌우하는 핵심 요소입니다.

---

# # 결론: 오늘 배운 내용을 실전 프로젝트에 적용해 보세요

Half Life 2의 문 버그는 “작은 수학적 오차가 큰 게임 버그로 이어질 수 있다”는 교훈을 줍니다.

1. **코드 작성 시 정밀도 선택을 신중히** – `float` vs `double`

2. **오차 보정 로직을 기본 템플릿에 포함**

3. **정기적인 좌표 재정렬**으로 누적 오차 방지

이제 여러분도 **부동소수점 정밀도**가 왜 중요한지, 그리고 어떻게 관리해야 하는지 알게 되었습니다.

다음 프로젝트에서 위 팁을 적용해 **버그 없는 게임**을 만들어 보세요!

> **행동 유도**: 이 글이 도움이 되었다면, 댓글로 여러분이 겪은 비슷한 버그 사례를 공유하고, SNS에 #HalfLife2버그 #부동소수점정밀도 #게임프로그래밍 해시태그와 함께 올려 주세요! 여러분의 경험이 다른 개발자에게 큰 도움이 됩니다.
