티스토리 뷰

C++

[ C++ ] 부동 소수점

겨울엔군고구마한잔 2025. 12. 2. 08:28

1. 기본 구조 (32-bit Float)

메모리 32비트를 어떻게 쪼개서 쓰느냐가 핵심입니다.

영역 비트 수 역할 의미
부호 (Sign) 1 bit 양수/음수 결정 0(+), 1(-)
지수 (Exponent) 8 bit 값의 크기(Range) 뻥튀기 $2^{E-127}$ (최대 $10^{38}$까지 범위 확장)
가수 (Mantissa) 23 bit 값의 정밀도(Precision) 유효 숫자 (실제 데이터의 알맹이)

2. 주요 상수 값 (Hex vs Actual)

상수 이름 10진수 값 (근사) 16진수 (메모리) 비트 특징 비고
FLT_MAX $\approx 3.4 \times 10^{38}$ 0x7F7FFFFF 지수: 254 (11111110)
가수: All 1
표현 가능한 가장 큰 양수.
(지수가 255면 무한대/NaN)
FLT_MIN $\approx 1.17 \times 10^{-38}$ 0x00800000 지수: 1 (00000001)
가수: All 0
0에 가장 가까운 정규화된 양수.
(가장 작은 음수 아님!)

3. 유효 가수 (Hidden Bit)

  • 저장은 23비트, 사용은 24비트:
    • 2진수는 맨 앞자리가 무조건 1이므로 저장하지 않고 생략합니다.
    • 계산할 때 CPU가 숨겨진 1을 복구합니다.
    • 유효 가수: 1.가수부(23bit)
  • 0xFFFFFF의 의미:
    • 가수부 23비트가 모두 1일 때, 숨겨진 1을 포함하면 총 24개의 1이 됩니다.
    • 이것을 16진수로 표현하면 0xFFFFFF가 되며, 이는 float이 가진 정밀도의 한계치를 의미합니다.

4. FLT_MAX의 GAP (최소 눈금)

이 부분이 대화의 하이라이트였습니다. 숫자가 커질수록 **눈금 사이의 간격(Gap)**도 지수적으로 벌어집니다.

  • FLT_MAX 근처에서의 1 눈금 크기:

    $$
    \text{Gap} = 2^{\text{지수(127)}} \times 2^{-\text{가수비트(23)}} = \mathbf{2^{104}} \approx 2 \times 10^{31}
    $$

  • 의미:

    • FLT_MAX 세상에서는 **$2^{104}$ (약 2,000양)**보다 작은 숫자는 먼지 취급을 받습니다.
    • FLT_MAX - (2^{104}보다 작은 수) = FLT_MAX (값이 안 변함)
  • "16진수 26개"의 비밀:

    • 16진수 26자리 $\times$ 4비트 = 104비트.
    • 즉, $2^{104}$보다 작은 수는 FLT_MAX의 최소 눈금조차 채우지 못하므로 무시된다는 뜻입니다.

5. int vs float 비교 (체급 차이)

  • 범위 (Range): float 압승
    • 지수(Exponent)의 마법으로 float(32bit)은 int(32bit)는 물론 int64(64bit)보다도 훨씬 더 큰 수를 담을 수 있습니다.
  • 정밀도 (Precision): int 승리 (특정 조건 하에)
    • int는 언제나 1단위를 정확히 구분합니다.
    • float은 숫자가 커지면 정밀도가 뚝뚝 떨어져서 소수점 오차가 발생합니다.

6. 결론: 개발 시 적용 포인트

  1. 일반적인 게임/그래픽스: float 사용 (속도 빠름, 적당한 오차 허용).
  2. 정밀 물리/우주 시뮬레이션: double 사용 (오차 발생 시점을 뒤로 미룸).
  3. 네트워크 동기화 (RTS/MOBA): int 기반의 고정 소수점(Fixed Point) 사용 (모든 PC에서 100% 동일한 결과 보장, 나비 효과 방지).
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함