본문 바로가기
알고리즘

8. 부동 소수점 vs 고정 소수점: 언제, 어떻게 사용할까? 🚀

by tata188726 2023. 5. 28.

프로그래밍에서 정확한 데이터 표현과 연산 속도를 고려할 때
가장 중요한 결정 중 하나가 부동 소수점(Floating-Point)과 고정 소수점(Fixed-Point) 중 어떤 것을 사용할 것인가? 이다.

부동 소수점(Floating-Point): 넓은 값 범위를 표현할 수 있지만, 정밀도가 제한될 수 있음
고정 소수점(Fixed-Point): 일정한 정밀도를 유지하지만, 표현할 수 있는 값의 범위가 제한됨

이번 글에서는 각 데이터 유형의 특징과 차이점, 그리고 실제로 어떻게 선택해야 하는지를 알아보자.


📌 1. 부동 소수점(Floating-Point) 개념

부동 소수점은 소수점이 "떠다닌다(floating)" 라는 개념에서 유래했다.
즉, 값의 크기에 따라 소수점 위치가 자동으로 조정되어 넓은 범위를 표현할 수 있다.

IEEE 754 표준을 따름
부호(Sign), 지수(Exponent), 가수(Mantissa)로 구성됨
소수점 위치가 동적으로 조정되어 넓은 범위의 숫자를 표현 가능
정밀도가 한정되어 있고, 반올림 오차(Rounding Error)가 발생할 수 있음

🚀 예제 (Python에서 부동 소수점 사용)

x = 3.141592653589793  # 부동 소수점 (float)
y = 1.2e3  # 1.2 * 10^3 → 1200.0 (지수 표현)
print(x, y)

📌 Tip: 부동 소수점은 과학 계산, 금융 계산, 그래픽 처리 등 정밀도보다는 넓은 범위를 요구하는 경우에 적합하다.


📌 2. 고정 소수점(Fixed-Point) 개념

고정 소수점은 소수점의 위치가 미리 정해져 있는 방식으로 숫자를 저장한다.
즉, 소수점 이하 자릿수를 고정하여 일정한 정밀도를 유지할 수 있다.

정수(Integer)로 표현되며, 특정 배율(Scale Factor)에 의해 소수점이 결정됨
연산 속도가 빠르고, 정밀도 손실이 적음
범위가 제한적이며, 너무 큰 값을 표현하기 어려울 수 있음

🚀 예제 (고정 소수점 연산 - Python 예제)

# 2자리 소수점 고정 (100을 곱해서 정수로 저장)
x = int(3.1415 * 100)  # 314 (소수점 없음)
y = int(2.7182 * 100)  # 271

# 다시 원래 값으로 변환
print(x / 100, y / 100)  # 3.14, 2.71

📌 Tip: 고정 소수점은 임베디드 시스템, DSP(디지털 신호 처리), 금융 시스템정확한 정밀도가 중요한 경우에 유용하다.


📌 3. 부동 소수점 vs 고정 소수점: 주요 차이점

특징 부동 소수점 (Floating-Point) 고정 소수점 (Fixed-Point)

소수점 위치 가변 (동적 조정) 고정 (미리 설정된 위치)
정밀도 반올림 오차 발생 가능 일정한 정밀도 유지
범위 매우 큰 값과 작은 값 표현 가능 값의 범위가 제한적
연산 속도 상대적으로 느림 빠름 (정수 연산 기반)
메모리 사용량 더 많은 메모리 필요 더 적은 메모리 사용
사용 사례 과학 계산, 그래픽, AI 임베디드 시스템, 금융 계산

📌 Tip:
정확한 계산이 필요하면 → 고정 소수점
넓은 값 범위가 필요하면 → 부동 소수점


📌 4. 부동 소수점 vs 고정 소수점: 선택 기준

데이터 유형을 선택할 때, 다음과 같은 요소를 고려해야 한다.

✅ 1) 정밀도 (Precision)

  • 부동 소수점: 정밀도 손실 가능 (예: 0.1 + 0.2 != 0.3)
  • 고정 소수점: 일정한 정밀도 유지

🚀 예제 (부동 소수점 정밀도 문제)

print(0.1 + 0.2)  # 예상: 0.3, 실제 출력: 0.30000000000000004

📌 Tip: 금융 계산에서는 반올림 오차가 문제될 수 있으므로, 고정 소수점을 사용하는 것이 좋다.


✅ 2) 값의 범위 (Range)

  • 부동 소수점: 매우 큰 수와 작은 수를 표현 가능
  • 고정 소수점: 표현할 수 있는 값의 범위가 한정적

🚀 예제 (부동 소수점의 넓은 범위 지원)

x = 1.2e-10  # 매우 작은 값
y = 3.4e38   # 매우 큰 값
print(x, y)

📌 Tip: AI, 그래픽 렌더링, 과학 계산 등에서는 부동 소수점이 필수적이다.


✅ 3) 연산 속도 (Performance)

  • 부동 소수점: 복잡한 연산이 필요하여 속도가 느릴 수 있음
  • 고정 소수점: 정수 기반 연산이므로 속도가 빠름

🚀 예제 (고정 소수점이 더 빠른 이유)

# 부동 소수점 연산
a = 3.14 * 2.71

# 고정 소수점 연산 (정수 연산)
b = (314 * 271) // 100  # 3.14 * 2.71 과 동일한 연산

📌 Tip: 실시간 데이터 처리, DSP(디지털 신호 처리)에서는 연산 속도가 중요한 경우 고정 소수점이 유리하다.


🔚 결론: 언제 부동 소수점 vs 고정 소수점을 사용할까?

📌 오늘 배운 핵심 요약
부동 소수점 (Floating-Point) → 넓은 범위를 표현하지만, 정밀도 손실 가능
고정 소수점 (Fixed-Point) → 일정한 정밀도를 유지하지만, 값의 범위가 제한적
정밀도가 중요한 경우 → 고정 소수점 (예: 금융 계산)
넓은 범위가 필요한 경우 → 부동 소수점 (예: AI, 그래픽)
실시간 성능이 중요한 경우 → 고정 소수점 (예: 임베디드 시스템)

🔥 "정확도가 중요한가? 속도가 중요한가?"
이 질문에 대한 답을 찾으면 올바른 데이터 유형을 선택할 수 있다! 🚀🔥


💡 다음 단계?
🔗 [부동 소수점 정밀도 문제 해결 방법]
🔗 [임베디드 시스템에서 고정 소수점 사용 예제]
🔗 [Python에서 Decimal 모듈을 사용한 고정 소수점 연산]

이제 실전에서 부동 소수점과 고정 소수점을 직접 활용해 보자! 🚀🔥