IEEE 754 부동 소수점 표현하기

IEEE 754란?

컴퓨터에서 부동 소수점을 표현하는 방법으로 IEEE 754 표준이 사용된다. 이 표준에서는 +0과 -0, 무한, NaN 등을 표시하는 방법과 이에 대한 연산 방법을 정의하고 있다. 표현 범위에 따라 32비트 단정밀도와 64비트 배정밀도 등으로 구분된다. 많은 프로그래밍 언어에서 부동 소수점 표현 방법으로 IEEE 754 표준을 적용하고 있다.

부동 소수점 표현은 부호, 지수, 가수 부분으로 구성된다. 32비트 단정밀도 기준으로 설명하면 부호 1비트, 지수 8비트, 가수 23비트로 구성되어 있다.

IEEE 754의 표현 방법

10진수 -218.6875를 IEEE 754(32비트 단정밀도)로 표현하는 방법을 설명해본다.

  • 먼저 음수이므로 부호 비트는 1이 된다.
  • 다음으로 절댓값을 2진수로 나타내면 11011010.1011(2)이 된다.
  • 2진수 절댓값의 소수점을 왼쪽으로 옮겨서 왼쪽에는 1만 남도록 만든다.
    여기에서는 11011010.1011(2) = 1.10110101011(2)×27과 같으며, 이 과정을 정규화라고 한다.
  • 가수 부분은 소수점 오른쪽 부분이며, 부족한 비트는 0으로 채워서 23비트로 만든다.
    여기에서는 10110101011000000000000이 된다.
  • 지수는 7이며, 여기에 Bias를 더한다. 32비트 단정밀도 형식에서 Bias는 127이므로 7+127 = 134가 된다. 이를 2진법으로 변환하면 10000110(2)이 된다.

결과적으로, -218.6875를 IEEE 754(32비트 단정밀도)로 표현하면
1 10000110 10110101011 000000000000이 된다.

부동 소수점 표현하기 (C언어)

필자가 대학교 졸업 직후 심심해서 Java 소스 코드를 살펴본 적이 있었다. 그 중에서 Native Method인 Float.intBitsToFloat() Method의 C언어 코드를 확인할 수 있었다. 코드는 의외로 단순했는데, C언어의 공용체(union) 기능을 활용한 코드였다. 아래 코드는 표준 입력으로 32비트 단정밀도 부동 소수점을 입력 받고, 16진수 정수로 변환한 결과를 표준 출력에 출력하는 코드이다. 이러한 원리를 이용하면 64비트 배정밀도 부동 소수점 변환도 가능하다.

C
#include <stdio.h>

int main(void) {
    union {
        int i;
        float f;
    } u;
    scanf("%f", &u.f);
    printf("0x%08X\n", u.i);
    return 0;
}

부동 소수점 연산 시 주의 사항

일반적으로 정확한 값이 아닌 근사 값을 표현하기 때문에 절댓값이 커질때 특히 주의해야 한다. 32비트 단정밀도 형식에서는 224보다 큰 정수를 정확하게 표현하지 못한다. 이는 부호 있는 32비트 정수를 모두 담을 수 없는 범위이다. 반면 64비트 배정밀도 형식에서는 253보다 큰 정수를 정확하게 표현하지 못한다. 절댓값이 커질수록 오차 범위가 커지기 때문에 일반적인 정수의 표현 범위를 넘어서는 매우 큰 정수를 표현하려는 목적으로 사용하려면 주의해야 한다.

댓글 남기기