티스토리 뷰
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)
- 2진수는 맨 앞자리가 무조건
- 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)보다도 훨씬 더 큰 수를 담을 수 있습니다.
- 지수(Exponent)의 마법으로
- 정밀도 (Precision):
int승리 (특정 조건 하에)int는 언제나 1단위를 정확히 구분합니다.float은 숫자가 커지면 정밀도가 뚝뚝 떨어져서 소수점 오차가 발생합니다.
6. 결론: 개발 시 적용 포인트
- 일반적인 게임/그래픽스:
float사용 (속도 빠름, 적당한 오차 허용). - 정밀 물리/우주 시뮬레이션:
double사용 (오차 발생 시점을 뒤로 미룸). - 네트워크 동기화 (RTS/MOBA):
int기반의 고정 소수점(Fixed Point) 사용 (모든 PC에서 100% 동일한 결과 보장, 나비 효과 방지).
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Reflection
- 수학
- void pointer
- C++
- RHICommand
- FloatingPoint
- 그래픽스
- 모던 C++ 챌린지
- RHI
- SFINAE #Template #C++
- GameEngine
- 로드리게스 회전 행렬
- cmakelists
- 세그먼테이션기법
- MemoryProject
- 포인터
- std::is_base_of
- void* pointer
- 뮤택스
- 증명
- 내부단편화
- 개발 일지
- 외부단편화
- pointer
- 페이징기법
- logproject
- 메모리
- 보이드 포인터
- GC
- cmake
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함