Contents

  1. 부동소수점 표현 공식 (IEEE 754)
  2. Example) FP32
  3. Fraction 설명


1. 부동소수점 표현 공식 (IEEE 754)

\(V = (-1)^{\text{sign}} \times (1.\text{fraction})_2 \times 2^{(\text{exponent} - \text{bias})}\).

\[V = (-1)^s \times (1 + \sum_{i=1}^n f_i 2^{-i}) \times 2^{(e-b)}\]
  • (s) sign: 부호 bit
    • 0이면 양수
    • 1이면 음수
  • (e) exponent: 지수부
    • bias를 적용해야 (빼줘야)!!
    • 범위를 결정하는 핵심 요소
  • (c) bias: 지수의 중앙값
    • (FP32) bias = 127 (범위: 1-127 ~ 254-127)
    • (FP16) bias = 15
    • (bfloat16) bias = 127
  • (d) fraction (mantissa): 유효 숫자부
    • 2진수 소수로 해석.
    • 맨 앞 “1”은 정규화에서 항상 implicit하게 존재


형식 구성 (s/e/f) 공식 값 범위 예시 (3.14) 바이트
FP32 1 / 8 / 23 \((-1)^s (1+\sum f_i 2^{-i}) 2^{e-127}\) \(±3.4×10^38\) 3.1415926 4 B
FP16 1 / 5 / 10 \((-1)^s (1+\sum f_i 2^{-i}) 2^{e-15}\) \(±6.55×10^4\) 3.1406 2 B
bfloat16 1 / 8 / 7 \((-1)^s (1+\sum f_i 2^{-i}) 2^{e-127}\) \(±3.4×10^38\) 3.140625 2 B
INT8 8비트 정수 \(-b_7·2^7 + \sum b_i 2^i\) \(-128~127\) 3 1 B
INT4 4비트 정수 \(-b_3·2^3 + \sum b_i 2^i\) \(-8~7\) 3 0.5 B


2. Example) FP32

(1) s/e/b/f

  • 부호 \(s\): 1 비트

  • 지수 \(e\): 8 비트 → 0~255 표현 가능
    • (참고) “지수” 그대로 사용하는 것이 아니라, “bias”를 빼줘야 함.

      \(\rightarrow\) 즉, 실제 지수는 \(E = e - 127\)

  • bias \(b\) = 127

  • fraction \(f\): 23 비트


(2) 지수 범위

FP32는 지수를 8비트로 표현하므로,

\(\rightarrow\) 0 (=0000000) ~ 255 (=11111111)을 표현할 수 있음


최소: \(e=1\)

\[E = e(1)-127 = -126\]
  • 왜 \(e=0\)이 아닌지?
    • 이 경우는 subnormal(비정규화 수) 또는 0을 표현하는 데 사용


최대: \(e=254\)

\[E = e(254)-127 = +127\]
  • 왜 \(e=255\)이 아닌지?
    • 이 경우는 특수 값에 사용
      • fraction = 0 → \(+\infty, -\infty\)
      • fraction ≠ 0 → NaN (Not a Number)


FP32: \(2^{-126} \leq 2^E \leq 2^{127}\)


(3) 유효숫자 (fraction) 범위

fraction은 항상 1.xxx 형태

  • 최소: 1.0
  • 최대: 거의 2.0
    • \(1.{111…1}_2\).
    • \(1 + 0.{111…1}_2\).
    • \(1+(2^{-1}+2^{-2}+...+2^{-32})\).
    • \(2 - 2^{-23}\).


따라서, 유효숫자(mantissa)는, \(1 \leq (1+\sum f_i 2^{-i}) < 2\).


(4) 최댓값

\(V = (-1)^s \times (1 + \sum_{i=1}^n f_i 2^{-i}) \times 2^{(e-b)}\).

  • a) \((-1)^s=(-1)^0 = 1\)
  • b) \((1 + \sum_{i=1}^n f_i 2^{-i}) \approx 2\)
  • c) \(2^{(e-b)} = 2^{254-127} = 2^{127}\)


\(V_{max} \approx 2 \times 2^{127} = 2^{128}\).

\(\rightarrow\) 10진수로 변환 시 \(2^{128} \approx 3.4 \times 10^{38}\)


(5) 최솟값 (양수)

\(V = (-1)^s \times (1 + \sum_{i=1}^n f_i 2^{-i}) \times 2^{(e-b)}\).

  • a) \((-1)^s=(-1)^0 = 1\)
  • b) \((1 + \sum_{i=1}^n f_i 2^{-i}) \approx 1\)
  • c) \(2^{(e-b)} = 2^{1-127} = 2^{-126}\)


\(V_{min} \approx 1 \times 2^{-126}\).

\(\rightarrow\) 10진수로 변환 시 \(1.18 \times 10^{-38}\).


3. Fraction 설명

왜 \(1 \leq (1 + \Sigma f_i 2^{-i}) < 2\)인지 ?


(1) Fraction (Mantissa)란?

\(V = (-1)^s \times (1 + \text{fraction}) \times 2^{(e - bias)}\),

\(\rightarrow\) 여기서 fraction은 \(f_1 f_2 f_3 … f_n\) (0 또는 1 bit들의 나열)이고,

\(\rightarrow\) 실제 값은 \(\text{fraction} = \sum_{i=1}^n f_i \cdot 2^{-i}\)


즉, 이진수 소수점으로 “0.xxx…” 부분을 표현하는 거!


(2) 왜 항상 1이 붙나? (정규화 normalized number)

IEEE 754의 정규화 규칙

  • 가장 앞자리(leading bit)는 항상 1이 되도록 저장.
  • 그래서 저장할 때는 이 1을 따로 안 적고, 계산할 때만 implicitly 1.을 붙입니다.

\(\rightarrow\) 즉, 실제 유효숫자 = \(1 + \text{fraction}.\)


(3) 범위 계산

fraction이 전부 \(0\)일 때:

  • \(1 + \sum f_i 2^{-i} = 1.0\).

fraction이 전부 1일 때 (예: 23비트 전부 1 in FP32):

  • \[1 + \left(2^{-1} + 2^{-2} + … + 2^{-23}\right) = 1 + (1 - 2^{-23}) = 2 - 2^{-23}\]


즉, 최소 1.0 ≤ mantissa < 2.0 이 되는 거예요.


(4) Example (FP32)

  • fraction = 000…0 → mantissa = 1.0
  • fraction = 100…0 → mantissa = 1 + 0.5 = 1.5
  • fraction = 111…1 → mantissa = 1.111…_2 = 1.99999988…

Categories: ,

Updated: