3️⃣ 컴퓨터 연산 방식
컴퓨터는 실수(Floating Point Number)를 정확하게 표현하고 연산할 수 있도록
부동소수점(Floating Point) 연산 방식을 사용합니다.
그러나, 실수를 이진수(Binary)로 변환하여 처리하는 과정에서 정확성 문제, 반올림 오류, 오버플로우/언더플로우 등의 문제가 발생할 수 있습니다.
이를 해결하기 위해 IEEE 754 표준(IEEE Standard for Floating-Point Arithmetic) 이 정의되었습니다.
이번 섹션에서는 부동소수점의 개념, IEEE 754 표준 형식, 연산 방식, 오차 문제, 그리고 실제 CPU에서의 부동소수점 연산 최적화 기법을 자세히 살펴보겠습니다.
🔹 1. 부동소수점(Floating Point)이란?
✅ 1.1 부동소수점의 개념
부동소수점은 소수점이 "고정(Fixed)"되지 않고, "부동(Floating)"하는 방식으로 표현되는 실수입니다.
💡 예제 (10진수 vs. 부동소수점 표현)
표현 방식 | 예제 (10진수 0.0123) |
고정소수점 (Fixed Point) | 00000000.00001111 |
부동소수점 (Floating Point) | 1.23 × 10⁻² |
✅ 부동소수점은 가수(Mantissa)와 지수(Exponent)를 사용하여 실수를 표현
✅ 소수점 위치를 유동적으로 조정하여 더 넓은 범위를 표현 가능
🔹 2. IEEE 754 부동소수점 표준
✅ 2.1 IEEE 754 표준이란?
IEEE 754 표준은 부동소수점을 저장하고 연산하는 방법을 정의한 국제 표준입니다.
이 표준은 정확한 연산을 보장하고, 하드웨어 및 소프트웨어 간의 호환성을 유지하는 역할을 합니다.
💡 IEEE 754 표준의 주요 형식
형식 | 비트 수 | 정밀도 | 예제 |
단정밀도(Single Precision) | 32비트 | 약 7자리 | float (C언어) |
배정밀도(Double Precision) | 64비트 | 약 15~17자리 | double (C언어) |
확장 정밀도(Extended Precision) | 80비트 이상 | 고정밀 연산 | 일부 CPU |
✅ 단정밀도(32비트)는 메모리를 절약하면서 빠른 연산 수행
✅ 배정밀도(64비트)는 더 높은 정확도를 제공
✅ 2.2 IEEE 754 부동소수점 형식
IEEE 754 표준에서 부동소수점은 부호(Sign), 지수(Exponent), 가수(Mantissa)로 구성됩니다.
비트 필드 | 설명 | 단정밀도 (32비트) | 배정밀도 (64비트) |
부호(Sign) | 양수(0), 음수(1) | 1비트 | 1비트 |
지수(Exponent) | 2의 지수 값 | 8비트 (127 기준) | 11비트 (1023 기준) |
가수(Mantissa) | 유효숫자 | 23비트 | 52비트 |
💡 IEEE 754 단정밀도 32비트 표현 (예제: 10진수 12.375)
1비트 | 8비트 지수 | 23비트 가수
------------------------------------------------
0 | 10000010 | 10001000000000000000000
✅ 2.3 IEEE 754 부동소수점 변환 과정
부동소수점 숫자를 IEEE 754 형식으로 변환하는 과정은 다음과 같습니다.
🔹 예제: 10진수 12.375 → IEEE 754 변환 (단정밀도 32비트)
1️⃣ 10진수를 2진수로 변환
12.375(10) = 1100.011(2)
2️⃣ 정규화(Normalization)
1.100011 × 2³
3️⃣ 부호(Sign) 결정
- 양수이므로 Sign = 0
4️⃣ 지수(Exponent) 계산 (Bias 적용)
- Bias = 127 (단정밀도)
- 3 (지수) + 127 = 130 (10000010₂)
5️⃣ 가수(Mantissa) 설정
- 소수점 이후의 비트만 저장 → 10001100000000000000000
💡 최종 IEEE 754 표현 (32비트)
0 10000010 10001100000000000000000
✅ 정규화(Normalization) 과정을 거쳐 IEEE 754 형식으로 변환됨
🔹 3. 부동소수점 연산 방식
부동소수점 연산은 정수 연산보다 복잡하고 오차가 발생할 가능성이 높음.
CPU는 부동소수점 연산을 수행할 때 FPU(Floating Point Unit) 를 사용하여 최적화된 연산을 수행합니다.
✅ 3.1 부동소수점 덧셈 & 뺄셈
1️⃣ 지수를 맞추기 위해 작은 수를 Shift
2️⃣ Mantissa(가수) 부분을 덧셈 또는 뺄셈 수행
3️⃣ 결과를 정규화하여 IEEE 754 형식 유지
💡 예제: 1.25 + 0.75 (IEEE 754 단정밀도)
1.25 = 1.010 × 2⁰
0.75 = 1.100 × 2⁰
------------------
11.000 × 2⁰ → 정규화 후 1.100 × 2¹
✅ 지수를 맞춘 후 덧셈 수행, 결과 정규화 필요
✅ 3.2 부동소수점 곱셈 & 나눗셈
✅ 곱셈(Multiplication)
- 가수를 곱하고, 지수를 더함
✅ 나눗셈(Division)
- 가수를 나누고, 지수를 뺌
💡 부동소수점 연산은 정수 연산보다 느리며, 하드웨어적으로 최적화가 필요함
🔹 4. 부동소수점 연산의 한계와 문제점
부동소수점 연산은 정확성이 필요한 경우 반올림 오류(Rounding Error), 오버플로우(Overflow), 언더플로우(Underflow) 문제가 발생할 수 있습니다.
문제 유형 | 설명 | 예제 |
반올림 오류 (Rounding Error) | IEEE 754에서 표현할 수 없는 값이 발생 | 0.1 + 0.2 ≠ 0.3 |
오버플로우 (Overflow) | 표현할 수 있는 최대값을 초과 | 10³⁰⁰ |
언더플로우 (Underflow) | 너무 작은 수를 표현할 수 없음 | 10⁻³⁰⁰ |
💡 해결 방법:
- Kahan Summation Algorithm 사용하여 반올림 오류 최소화
- 소프트웨어적으로 다중 정밀도 연산(BigFloat) 활용
✅ 마무리: IEEE 754 부동소수점 연산 핵심 정리
✅ 부동소수점은 지수(Exponent)와 가수(Mantissa)를 이용하여 실수를 표현
✅ IEEE 754 표준은 단정밀도(32비트), 배정밀도(64비트)로 구분됨
✅ 연산 과정에서 반올림 오류, 오버플로우, 언더플로우 문제가 발생할 수 있음
✅ FPU와 SIMD 명령어(SSE, AVX)를 활용하여 성능 최적화 가능
'IT > 컴퓨터구조' 카테고리의 다른 글
🖥️ [컴퓨터구조] CPU 내부 구조 개요 (0) | 2025.03.08 |
---|---|
🖥️ [컴퓨터구조] 연산 속도를 높이는 방법 (병렬 연산, SIMD, 벡터 연산) (1) | 2025.03.07 |
🖥️ [컴퓨터구조] 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈) (0) | 2025.03.05 |
🖥️ [컴퓨터구조] 프로그램 번역 과정 (컴파일러와 인터프리터) (1) | 2025.03.02 |
🖥️ [컴퓨터구조] 병렬성과 동기화 문제 (0) | 2025.03.01 |