프로그래밍 언어/C

01. 실수 표현 (고정 소수점과 부동 소수점)

coding-l7 2025. 3. 31. 11:06

✅ 고정 소수점 (Fixed-Point)

소수점의 위치를 고정시켜 실수를 표현하는 방식이다.


🧩 구조 (32비트 기준)

32비트 기준 고정 소수점은 다음과 같이 비트를 사용하여 표현한다:

  • 1비트: 부호
  • 15비트: 정수부
  • 16비트: 소수부

💡 예시: 9.6875의 표현

9.6875 → 0000 0000 0000 1001.1011 0000 0000 0000

소수부 변환 과정 (2진수로 * 2 반복):

0.6875 * 2 = 1.375 → 1
0.375  * 2 = 0.75  → 0
0.75   * 2 = 1.5   → 1
0.5    * 2 = 1.0   → 1

→ 소수부: 0.1011

 


✅ 장단점

장점 단점
계산이 간단 (고정 포맷) 정밀도/표현 범위가 좁음
하드웨어 구현이 쉬움 오차가 빠르게 커질 수 있음

 


✅ 부동 소수점 (Floating-Point)

고정 소수점보다 더 넓은 범위와 정밀도를 표현할 수 있도록 설계된 실수 표현 방식이다.

 


🔸 정규화(Normalization)

실수의 가수부를 1.xxxx 형태로 정규화하고, 지수부를 통해 자릿수 이동을 표현하는 과정이다.


🔹 예시 (2진수 정규화)

-11.4₁₀ → -1011.0110 0110 0110…₂
        → -1.01101100110… × 2³

🧮 IEEE 754 표준 구조 (단정도, 32비트)

구성 비트 수 설명
부호 (Sign) 1비트 양수: 0 / 음수: 1
지수 (Exponent) 8비트 Bias: 127
가수 (Mantissa) 23비트 앞의 1은 생략 (암묵적 1)

 

이때, 지수 값 0과 255는 비정규화 수/특수값(NaN, ±∞)에 사용된다.

실제 유효 지수 범위: 1~254 → 실제 지수: -126 ~ +127


📌 예시: -11.4를 IEEE 754 단정도로 표현

  1. 정규화: 1.0110110011… × 2³
  2. 부호 비트: 1
  3. 지수 비트: 3 + 127 = 13010000010₂
  4. 가수 비트: 01101100110011001100110 (23비트로 자름)

✅ 최종 결과:

1 10000010 01101100110011001100110
→ 11000001 00110110 01100110 01100110

📏 배정도(Double-Precision, 64비트)

항목 설명
부호 비트 1비트
지수 비트 11비트 (Bias: 1023)
가수 비트 52비트

⚠️  실수 비교 시 주의

부동 소수점은 근사값이기 때문에, 다음과 같은 비교는 정확하지 않다:

if (a == b) { ... }  // 부정확!

✔ 권장 방식

if (fabs(a - b) < 1e-6) { ... }  // 오차 범위 내 비교

✅ 고정 vs 부동 소수점 비교

항목 고정 소수점 부동 소수점
계산 속도 빠름 상대적으로 느림
표현 범위 좁음 넓음
정밀도 낮음 높음
하드웨어 구현 간단 복잡
사용 예 임베디드, DSP 일반적 실수 계산, 과학 연산

🔗 참고

https://t.hi098123.com/IEEE-754