부동소수점은 소수점을 고정된 위치에 두지 않고, 가변적인 방식으로 표현하는 수의 형태이다.
즉, 아주 크거나 아주 작은 숫자를 효율적으로 표현할 수 있다.
정수형 데이터(int, long)는 소수점이 없는 값을 표현하지만, 실수(float, double)는 소수점을 포함하는 값을 다루어야 한다.
하지만, 고정소수점(Fixed Point) 방식은 범위가 제한되므로, 더 넓은 범위의 실수를 표현하기 위해 부동소수점 방식을 사용한다.

부동소수점 수는 부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 나뉜다.
32비트 단정도(float)
| 부호 (1비트) | 지수 (8비트) | 가수 (23비트) |
|---|---|---|
S | E | M |
S): 0이면 양수, 1이면 음수E): 8비트로 저장되며 Bias (127)를 적용하여 표현M): 1.xxx... 형태로 저장64비트 배정도(double)
| 부호 (1비트) | 지수 (11비트) | 가수 (52비트) |
|---|---|---|
S | E | M |
부동소수점의 예제
예시: 0.15625를 부동소수점으로 변환
이진수로 변환
0.15625 (10진수) → 0.00101 (2진수)
정규화
1.010 × 2^(-3)
IEEE 754 형식으로 변환
S): 0 (양수)E): 3 + 127 = 124 → 01111100M): 0100000... (23비트로 맞춤)0 01111100 01000000000000000000000 (32비트)x87)으로 존재했지만, 현대 CPU에는 내장되어 있음(1) 실수 표현의 필요성
int, long)만으로는 소수점이 포함된 숫자(예: 3.14, 0.0001, 2.718)를 다룰 수 없다.(2) 매우 큰 수와 매우 작은 수 표현 가능
1.23 × 10^100)와 아주 작은 수(예: 3.14 × 10^-50)도 저장할 수 있다.float(32비트)는 ±10⁻³⁸ ~ 10³⁸까지 표현 가능하고, double(64비트)는 ±10⁻³⁰⁸ ~ 10³⁰⁸까지 표현 가능하다.(3) 효율적인 저장 방식
float)은 ±10⁻³⁸ ~ 10³⁸ 범위의 숫자를 단 4바이트에 저장한다.(4) 표준화된 연산 방식
부동소수점은 매우 유용하지만, 몇 가지 단점도 있다.
(1) 정확도 문제 (오차 발생)
0.0001100110011...)가 되어, 근사값으로 저장된다.
print(0.1 + 0.2) # 결과: 0.30000000000000004
(2) 연산 속도가 정수보다 느림
(3) 비교 연산이 부정확할 수 있음
if x == y: 같은 비교 연산이 예상과 다르게 동작할 수 있다.