부동소수점 표현

Bam·2023년 9월 25일
0

CS

목록 보기
25/26
post-thumbnail

컴퓨터에는 모든 데이터를 01의 디지털 신호로 나타냅니다. 숫자도 마찬가지인데요. 정수는 단순히 10진수에서 2진수로 변화하지만 실수 표현에 대해서는 조금 특별한 방식을 사용합니다.


부동소수점수

컴퓨터는 실수를 부동소수점수(floating point number)로 표현합니다. 이 부동소수점수과학 표기법을 응용해서 표기하는 방식입니다.

과학 표기법(Scientific notation)은 10진수 123.456가 있다고 할 때, 이 수를 다음과 같이 표기하는 방식입니다.

과학 표기법에 따라 부동소수점수는 실수를 부호(sign), 지수(exponent), 가수(mantissa) 부분으로 나눠서 표기하게 됩니다.

부호는 실수가 양수(0)인지 음수(1)인지를 나타내고, 지수는 2의 지수, 가수는 소수점 이하 수를 나타냅니다.

이 수에서 부호는 +, 가수는 1.23456, 지수는 2입니다. (현재 수가 10진수이므로 지수가 10의 지수가 됩니다.)

이때 표현 범위에 따라서 단정도(single precision, 32bit)배정도(double precision, 64bit) 부동소수점수 표현으로 나뉩니다.

단정도배정도이미지 출처

초기 컴퓨팅에서는 부동소수점 표현에서 각자 다른 표현법을 사용했으나, 호환성에 대한 필요성이 등장하고 현재는 IEEE에서 표준화한 IEEE754 형식을 주로 사용하고 있습니다.


정규화

가수 부분에 수를 표현하기 위해서 정규화(normalized mantissa)를 이용합니다. 정규화는 간단히 표현해서 가수를 1.ㅁㅁㅁ...×2^n 형식으로 나타내는 것을 의미합니다.

정규화는 다음과 같은 공식으로 수행합니다.

  • (2진수가 아닐경우) 2진수로 변환한다.
  • 가수를 1.ㅁㅁㅁ...형식으로 표현이 가능하도록 지수를 조정한다.
    즉, 일의 자리만 남기고 모든 자릿수를 한 칸씩 밀어낸다.
  • 밀어낸 자릿수 만큼 2^n에서 지수 n을 채운다. 오른쪽으로 밀면 +, 왼쪽으로 밀면 -
  • 가수 표현에서 항상 일의 자리가 1이기 때문에 실제 표현에서는 1을 생략하고 .ㅁㅁㅁ...만 표현합니다.
  • 0이라면 가수를 모두 0으로 채웁니다.

하나의 예시로 직접 정규화를 수행해보겠습니다.

2진수 1100.01을 정규화 합니다.

  1. 일의 자리 1만 남기고 숫자를 소수 부분으로 넘깁니다.
    1.10001
  2. 밀어낸 자릿수에 따라 지수를 적습니다. (3칸 오른쪽으로 밀었으므로 지수는 +3)



    2진수 0.001101을 정규화 합니다.
  1. 일의 자리가 1이 되도록 소수를 왼쪽으로 밀어냅니다.
    1.101
  2. 밀어낸 자릿수에 따라 지수를 적습니다. (3칸 왼쪽으로 밀었으므로 지수는 -3)

바이어스

부동소수점수에서 지수를 표현하기 위해 바이어스(bias)라는 개념을 사용합니다.

이 이유는 지수를 부호 없는 수(unsigned number)로 표현하기 위해서 입니다. 지수를 부호 없는 수로 표현하는 이유는 실수 연산 때문입니다. 실수를 연산하기 위해서 작은 수의 지수와 가수를 조정해야하는데, 이 과정에서 일반적인 2의 보수로 표현을 하면 양수 음수에 따른 비교 과정이 필요해지기 때문에 연산이 복잡해집니다. 따라서 부호 없는 수 표현을 통해 실수 연산을 편리하게 할 수 있게 되어 채택된 방식이라고 할 수 있습니다.

바이어스는 지수에서 특정 수를 더하는건데요. 단정도방식에서는 127(0111_1111)을 더하고, 배정도방식에서는 1023(0011_1111_1111)을 지수에 더합니다.

단정도방식에서 위 수를 실제로 표현할 때
가수는 정수부 1을 제외하고 10001만을 표현합니다. 부호는 양수이므로 0, 지수는 +3이므로 011에 바이어스 127(0111_1111)을 더한 1000_0010으로 표현됩니다.


마찬가지로 단정도방식으로 표현하면
가수101, 부호는 양수이므로 0, 지수는 -3이므로 바이어스 127(0111_1111)에서 011을 뺀 값 0111_1100으로 표현됩니다.

부동소수점수 표현

그러면 위에서 정규화, 바이어스 개념을 배웠으니 IEEE754 형식의 부동소수점수를 이제 우리는 표기할 수 있습니다.

참고로 가수를 표현할 때 남는 공간에는 0을 채워넣습니다.

이 수를 단정도 부동소수점수로 표현하면 다음과 같습니다.


특수한 값과 연산의 결과

IEEE754 방식에선 특정 연산의 결과에 대한 부동소수점수 표현이 존재합니다.

특수한 값에 대한 부동소수점수 표현은 다음과 같습니다.

  • underflow
    underflow는 0은 아니지만 0에 무한으로 가까워지는 수로 지수와 가수를 0으로 표기합니다.

  • overflow (+∞, -∞)
    표현 범위를 벗어난 수로 +∞와 -∞가 있습니다. 이 경우에 지수가 모두 1, 가수는 모두 0으로 나나타내며 ±는 부호 비트로 구분합니다.

  • NaN
    Not a Number, 숫자가 아닌 수로 숫자 표현이 불가능한 수입니다. 따라서 지수는 모두 1이지만 가수가 모두 0이 아닌 경우로 표현합니다.

그리고 특수한 연산 결과에 대한 부동소수점수 표현은 다음과 같습니다.

연산결과
n/±∞0
±∞ × ±∞±∞
±n / 0(n은 0이 아님) ±∞
∞ + ∞
±0 / ±0NaN
∞ - ∞NaN
±∞ / ±∞NaN
±∞ × 0NaN

0개의 댓글