IEEE 754 부동소수점 변환 쉽게 이해하기 — 개념과 원리
IEEE 754는 컴퓨터가 실수를 2진수로 저장하는 방법을 정한 국제 표준입니다. 이 변환기는 10진수가 32비트 단정밀도와 64비트 배정밀도에서 어떻게 저장되는지 보여 주고, 32비트 패턴을 부호부, 지수부, 가수부로 나누어 표시하며, 실제로 저장된 값을 알려 줍니다.
계산 방법
정규화된 부동소수점 수는 다음과 같이 저장됩니다.
값 = (−1)^s × 1.f × 2^(e − 바이어스)
- s(부호부): 1비트이며 양수는 0, 음수는 1입니다.
- e(지수부): 단정밀도는 8비트에 바이어스 127, 배정밀도는 11비트에 바이어스 1023을 씁니다.
- f(가수부): 단정밀도 23비트, 배정밀도 52비트입니다. 맨 앞의 1은 저장하지 않고 생략하므로 유효 비트는 각각 24비트, 53비트입니다.
입력값은 표현 가능한 가장 가까운 값으로 반올림됩니다(같은 거리이면 짝수 쪽).
원리
부동소수점은 2진법으로 쓴 과학적 표기법입니다. 정해진 개수의 유효 비트와 소수점 위치를 옮기는 지수를 함께 저장하므로, 아주 넓은 범위를 다루면서도 상대 정밀도는 단정밀도 약 7자리, 배정밀도 약 16자리로 일정합니다. 다만 분모가 2의 거듭제곱인 분수만 정확히 저장할 수 있습니다. 1/10은 분모에 5가 있어 2진법으로는 0.000110011001100…처럼 끝없이 순환하므로, 10진법에서 1/3을 반올림하듯 중간에서 잘라 반올림해야 합니다.
예제 풀이
- 입력값: 0.1입니다. 0.1 = 1.6 × 2⁻⁴이고 양수이므로 s = 0입니다.
- 지수부는 −4 + 127 = 123 = 01111011입니다.
- 0.6을 2진수로 쓰면 0.1001 1001 1001…이고, 23비트에서 마지막 자리를 반올림하면 10011001100110011001101입니다.
- 비트를 이어 붙인 0 01111011 10011001100110011001101은 16진수로 3DCCCCCD입니다.
- 실제 저장된 값은 13,421,773 ÷ 2²⁷ = 0.100000001490116…이며 0.1000000015로 표시됩니다.
- 배정밀도는 지수부 −4 + 1023 = 1019 = 3FB, 가수부는 999999999999A로 반올림되어 3FB999999999999A입니다.
결과 해석
저장된 값과 입력값의 차이가 표현 오차입니다. 0.1을 단정밀도로 저장하면 오차가 약 1.5 × 10⁻⁹이고, 배정밀도로는 0.1000000000000000055…로 유효숫자 약 17자리까지 맞습니다. 지수부가 모두 0이면 0 또는 비정규 수, 모두 1이면 무한대나 NaN입니다. 단정밀도의 가장 큰 유한값은 약 3.40 × 10³⁸, 배정밀도는 약 1.80 × 10³⁰⁸입니다.
흔한 실수
- 부동소수점 결과를 ==로 비교합니다. 작은 허용 오차를 두고 비교해야 합니다.
- 금액 계산에 2진 부동소수점을 씁니다. 원 단위 정수나 10진 자료형을 쓰는 것이 안전합니다.
- 바이어스를 빼지 않고 지수부를 그대로 거듭제곱 지수로 읽습니다.
자주 묻는 질문
0.1 + 0.2가 왜 0.30000000000000004가 되나요?
두 수가 저장될 때 이미 반올림되고, 그 합이 0.3에 가장 가까운 배정밀도 값이 아니라 바로 위의 값으로 반올림되기 때문입니다.
배정밀도로 정확히 저장할 수 있는 정수는 어디까지인가요?
절댓값이 2⁵³ = 9,007,199,254,740,992 이하인 모든 정수입니다.
출처: IEEE Std 754-2019, IEEE Standard for Floating-Point Arithmetic · D. Goldberg, "What Every Computer Scientist Should Know About Floating-Point Arithmetic", ACM Computing Surveys 23(1), 1991