서론

  • N사 신입 채용 중에 2차 전공지식 테스트가 있었다. 정보처리기사를 취득할 때처럼 단순히 CS개념을 알고있는 것을 테스트하는 것이 아니라 정말 개념을 이해하고 있는지, 원리에 대해서 물어보는 것이 많았다. 그 중 정리하고 싶은 개념(부동 소수점)이 있어서 이렇게 포스팅을 쓴다.

이진기수법

  • 컴퓨터는 0과 1로 이루어진 기계어를 사용한다.
  • 사람은 10진법으로 수를 표현하지만, 컴퓨터는 2진법으로 계산한다.
    • ex) 4 => 100(2), 10 => 1010(2)
  • floating point
  • 그렇다면 실수는 어떻게 표현할 것인가
    • 소수점 앞부부은 위와 같이 정수 변환하는 거랑 똑같이 하면 된다.
    • 소수부는 정수부 변환의 반대로 하면 된다.
    • 정수부에서는 10진수를 2로 나누어가면서 1이나 0을 구했다면, 소수부는 10진수에 2를 곱해가면서 1이나 0을 뽑아낸다.
    • 정수부 변환할때는 1이 나오면 종료했다면, 소수부에서는 0이 나오면 종료한다. 그리고 결과를 밑에서부터가 아니라 위에서부터 읽어준다.
  • ex) 0.625를 이진수로 변화해보자
    • 0.625 * 2 = 1.25 → 1을 빼내고 나머지 0.25
    • 0.25 * 2 = 0.5 → 0을 빼내고 나머지 0.5
    • 0.5 * 2 = 1 → 1을 빼내고 나머지 0
    • 빼낸 숫자들을 위에서 부터 읽으면 0.101(2) 가 된다.

고정 소수점

  • Fixed Point
  • 고정 소수점 표현 방식은 10진수를 2진수로 바꿨으면, 정해진 위치에 그대로 박아넣는 방식이다.
  • ex) 7.625 라는 실수를 이진수로 변환하면 111.101(2) 가 된다.
  • floating point2
  • 맨 앞자리는 부호 비트(Sign Bit)로 0 이면 양수, 1이면 음수이다.
  • 소수점의 위치가 정해지고 소수점을 기준으로 정수부와 소수부가 나누어 진다.
  • 값을 표현하고 남는 부분에는 0을 채워 넣는다.
  • 이런 표현 방식은 구현하기는 편리하지만 비트 수 대비 표현 가능한 수의 범위 또는 정밀도가 낮기 때문에 실수를 다루는 시스템에서는 거의 사용하지 않는다.

부동 소수점

  • Floating Point
  • 소수점을 ‘이동’ 시킨다.
  • 여기서는 2진수로 변환한 결과를 바로 표현하지 않고 정규화 과정을 거친다.
  • 정규화 과정 : 1.xxx… * 2^n
    • 정수부에 1만 남을때까지 소수점을 왼쪽으로 이동시키고, 이동한 칸 수만큼 n자리에 추가하면 된다.
    • ex) 111.101 → 1.11101 * 2^2
  • IEEE 754 부동소수점 표현(32비트 기준)
    • floating point3
  • 부호 비트는 0이면 양수, 1이면 음수
  • 23자리 가수부는 정규화 결과 소수점 오른쪽에 있는 숫자들을 차례로 적어 넣으면 된다. 남는 자리는 0으로 채운다.
  • 소수점 왼쪽은 정규화를 하면 무조건 1이기 때문에 신경쓰지 않고 표현도 안하다. 이 1을 hidden bit라고 부른다.
  • 8자리 지수부에는 2^n에서 n에 해당하는 수를 2진수로 변환해서 넣으면 된다. 단 변환한 값을 그대로 넣는 것이 아니라 ‘bias‘라고 지정된 숫자를 더한 다음 넣어야 한다.
    • IEEE표준에서 32비트를 사용하는 경우 bias는 127로 규정되어 있다.
    • 위 예시에서 2 + 127 = 129를 2진수로 바꾼 10000001(2)이 들어간다.
    • floating point4
    • bias를 사용하는 이유는 지수가 음수가 될 수 있기 때문이다.
    • ex) 0.000101(2) 를 정규화를 하면 1.01 * 2^-4 가 된다. -4를 따로 표현할 수가 없기 때문에 이를 위해 bias를 더해준다.
    • bias가 127이라면 0~127 구간은 음수, 128~255 구간은 양수를 표현하게 된다.
  • 흔히 프로그래밍 언어에서 실수를 표현하는데 float과 double이 있다.
    • float(Single-Precision)은 32비트, double(Double-Precision)은 64비트를 사용한다는 의미인 것이었다.
    • double은 지수부가 11비트, 가수부가 52비트이다. 지수부가 2^11, 즉 2048개의 수를 표현할 수 있다.
    • 0~1023 구간은 음수, 1024~2047 구간은 양수를 의미하며 bias는 1023이 된다.

정리

  • 학부시절 1학년때 컴퓨터 개론 수업을 배웠을 때에는 개념에 대해서 알게 되는 정도였다면 다시 공부해보니 왜 이러한 개념이 나오게 됐는지 알아가게 되서 더욱 재밌는것 같다. 원리를 이해하도록 노력해야겠다.