부동 소수점 - 1. 부동 소수점이란?
2025. 2. 8. 16:30ㆍ소프트웨어/기초
부동 소수점이란?
컴퓨터는 숫자를 2진수(0과 1)로 저장하고 계산합니다. 하지만 우리가 사용하는 소수(1.5, 3.1415, 0.25 등)를 정확하게 표현하려면 어떻게 해야 할까요?
소수점의 위치가 유동적인 개념
부동 소수점(Floating-Point)이라는 표현은 소수점의 위치가 고정되지 않고(유동적으로 변화) 조정될 수 있다는 의미입니다.
예를 들어, 다음 두 숫자를 생각해 봅시다.
- 123.45
- 0.0012345
이 두 숫자는 크기가 다르지만, 둘 다 "1.2345 × 10^{-1}" 또는 "1.2345 × 10^{4}"처럼 표현할 수 있습니다.
즉, 소수점의 위치를 자유롭게 조정하면 숫자의 크기에 관계없이 같은 방식으로 표현할 수 있습니다.
컴퓨터는 **10진법이 아니라 2진법(0과 1만 사용)**을 사용하므로, 실제로 부동 소수점도 2진수 형태로 저장됩니다.
2진수 부동 소수점 표현 예시
10진법에서는 1.2345×1041.2345 × 10^4처럼 숫자를 표현하지만, 컴퓨터는 이를 2진법으로 변환하여 저장합니다. 예를 들어:
- 10진수 10.75는 2진수로 1010.1121010.11_2 (소수점 이하 포함)
- 이를 부동 소수점 형태로 변환하면 1.010112×231.01011_2 × 2^3
이처럼 컴퓨터는 정규화된 형태로 숫자를 저장합니다.
하지만, 0.1 같은 숫자는 2진수로 정확히 표현할 수 없습니다.
- 10진수 0.1을 2진수로 변환하면 0.00011001100110011...20.00011001100110011..._2(무한 반복)
- 따라서, 컴퓨터는 이를 근사값으로 저장하게 됩니다.
왜 정수만으로는 부족할까?
컴퓨터가 정수만 저장한다면, 다음과 같은 문제가 발생합니다.
✅ 정수만 저장하면 표현할 수 없는 숫자들이 많다!
- 1, 2, 3 같은 정수는 쉽게 저장할 수 있지만, 1.5나 3.1415 같은 소수(실수)는 정수만으로 표현할 수 없습니다.
✅ 정밀한 계산이 어렵다!
- 예를 들어, 원주율(π = 3.141592…)처럼 정밀한 값이 필요한 경우, 정수만으로는 적절히 표현할 수 없습니다.
- 물리 계산, 금융 연산, 그래픽 처리 등에서는 정밀한 실수가 필수적입니다.
예제: 정수만 사용하면 표현할 수 없는 숫자
숫자 | 정수로 표현 가능? | 설명 |
5 | ✅ 가능 | 정수이므로 문제 없음 |
2.5 | ❌ 불가능 | 소수점 때문에 정수로 표현 불가 |
3.1415 | ❌ 불가능 | π처럼 복잡한 실수는 정수로 표현 불가 |
이런 문제를 해결하기 위해 부동 소수점(floating-point)이라는 방식을 사용하여 소수를 효율적으로 표현합니다.
부동 소수점의 한계
부동 소수점은 매우 유용하지만, 몇 가지 한계가 있습니다.
- 정확도 문제 (부동 소수점 오차)
- 일부 소수는 2진수로 정확하게 표현할 수 없습니다.
- 예를 들어, 0.1은 2진수에서 무한 반복되는 소수이므로, 컴퓨터는 이를 근사치로 저장합니다.
- 예제:
print(0.1 + 0.2) # 출력: 0.30000000000000004
- 위 결과는 Python에서 실행한 경우이며, 다른 프로그래밍 언어나 환경에서는 미세한 차이가 있을 수 있습니다.
- 이는 컴퓨터가 부동 소수점을 근사값으로 저장하기 때문입니다.
- 반올림 오차 (Rounding Error)
- 특정 연산을 수행할 때 작은 오차가 누적되어 결과가 틀어질 수 있습니다.
- 예를 들어, 100번 반복해서 0.1을 더하면, 10이 아닌 9.9999999999가 될 수도 있습니다.
정리
- 부동 소수점은 정수를 넘어 실수를 표현할 수 있는 중요한 방식이다.
- 소수점의 위치를 변하게 하여 더 많은 숫자를 표현할 수 있다.
- 하지만 정확한 표현이 어렵고, 연산 과정에서 작은 오차가 발생할 수 있다.
'소프트웨어 > 기초' 카테고리의 다른 글
부동 소수점 - 3. 부동 소수점 표기법 (IEEE 754 표준 개념) (0) | 2025.02.08 |
---|---|
부동 소수점 - 2. 컴퓨터가 숫자를 표현하는 방식 (0) | 2025.02.08 |
부호 있는 정수(Signed Integer) vs 부호 없는 정수(Unsigned Integer) (0) | 2025.02.04 |
1의 보수 vs 2의 보수 (0) | 2025.02.04 |
2의 보수(Two’s Complement) 정리 (0) | 2025.02.04 |