[Chapter 1-b] 고정소수점, 부동소수점, IEEE 754

cherry·2022년 2월 23일
0

실수를 표현하기 위해 2진 소수점을 표현할 방법이 필요하다. 정수의 경우와 마찬가지로 문맥에 따라 실수를 표현하는 방법이 달라질 수 있다.

📚 실수를 표현하는 방법

1. 고정소수점 표현법

2진수를 사용해 소수를 표현하기 위해 2진 소수점의 위치를 임의로 정하는 방법이 있다. 예를 들어, 4비트가 있다면 그 중 2비트는 2진 소수점의 오른쪽에 있는 분수들을 표현하는 데 쓰고(네가지 분숫값 표현), 2비트는 왼쪽에 있는 숫자들을 표현하는 데 쓸 수 있다(네가지 정숫값 표현).

이렇게 소수점의 위치가 항상 일정하기 때문에 이런 방식을
고정소수점(fixed-point) 표현법이라고 부른다.

10.01은 10이 정수 부분이고 01은 분수 부분이다.
따라서 정수 부분은 2이며, 분수 부분은 0.25(1/4)이다.
정수 부분은 2진 표현법과 비슷하다.
소수점 오른쪽에 있는 숫자들(분수 부분)은 2진수의 경우 1/2, 1/4 등 2의 거듭제곱을 분모로 사용한다.

하지만 쓸모 있는 범위의 실숫값을 표현하기 위해 필요한 비트 개수가 너무 많기 때문에 범용 컴퓨터(일반적인 문제를 해결하기 위해 만들어진 컴퓨터)에서 이런 방식을 사용하는 경우는 드물다. 일반적인 문제를 해결하려면 더 넓은 범위의 수를 다룰 수 있어야 한다.

2. 부동소수점 표현법

더 넓은 범위의 값을 2진수로 표현하기 위해 과학적 표기법을 2진수에 적용한다. 과학적 표기법은 수를 해석하는 새로운 방법을 도입해서 큰 범위의 수를 표현한다.

예를 들어, 가수(10진 소수점 왼쪽이 한 자리뿐인 소수)에 10을 몇번(지수) 거듭제곱한 값을 곱하는 방식으로 소수를 표현한다. 2진법으로 표기할 때는 10이 아닌 2을 밑으로 한다.
따라서 가수 부분은(소수점 왼쪽이 한 자리뿐인) 2진 소수, 지수 부분은 2의 거듭제곱 횟수를 표현한다.

0.0012 대신 1.2 X 10^-3 이라고 쓰며,
이 값은 1.2 X 0.001이므로 0.0012와 같다.

부동소수점(floating-point) 표현법이라고 부르는 이유가 헷갈릴 수 있다. 단순히 가수 부분의 소수점의 위치가 같아 보이기 때문이다. 하지만 가수가 같다고 해도 지수가 무엇이냐에 따라 소수점 왼쪽 숫자의 자리가 1/10일 수도 있고(1.2 X 10^-1), 1일 수도 있다(1.2 X 10^0)는 점을 생각하면 소수점 위치는 정해져 있지 않다고 말할 수 있다.

반면에 고정소수점은 12.00, 01.20, 00.12와 같이 소수점 왼쪽의 수는 항상 일의 자리이다.(소수점 고정)

부동소수점은 지수의 밑이 2라는 숫자를 비트로 표현할 필요가 없다. 부동소수점 정의상 밑 2는 항상 정해져 있다.

그런데 부동소수점 표현법도 역시 비효율적이다.

  • 첫째, 비트 조합 중에 낭비되는 부분이 역시 많다. 4비트를 가정한다면, 0을 표현하는데 네 가지가 있고 1.0, 2.0 등을 표현하는 방법도 두 가지씩 있다.
  • 둘째, 비트 패턴이 가능한 모든 수를 표현하지 못한다. 지수가 커질수록 가수의 한 패턴과 다른 패턴 사이의 값 차이가 커진다. 6.5를 표현하는 비트 패턴이 없기에 0.5와 6.0을 더할 수도 없다.

IEEE 부동소수점 수 표준

이상하지만 부동소수점 수 시스템은 컴퓨터에서 계산을 수행할 때 실수를 표현하는 표준 방법이다. 가수와 지수에 각각 부호 비트를 사용한다. 단, 지수에 대한 부호 비트는 지수의 비트패턴에 감춰져 있다. 그리고 낭비되는 비트 조합을 최소화하고 반올림을 쉽게 하기 위한 여러가지 트릭이 사용된다. IEEE 754라는 표준은 이 모든 기능을 정의한다.

IEEE는 미국 전자전기공학회(Institute of Electrical and Electronic Engineers)의 약자로, 표준 제정 등 다양한 활동을 하는 전문가 조직이다.

  • 한 가지 트릭은 정규화(normalization)다. 정규화는 가수를 조정해서 맨 왼쪽에 0이 없게 만드는 것이다. 이런 식으로 가수를 조정하려면 지수도 조정해야 한다.
  • 두 번째 트릭은 가수의 맨 왼쪽 비트가 1이라는 사실을 알고 있으므로 이를 생략하는 것이다. 이로 인해 가수에 1비트를 더 사용할 수 있다.

IEEE 754 형식에는 주로 쓰이는 두 가지 부동소수점 수가 있다. 바로 기본 정밀도(single precision) 부동소수점 수, 2배 정밀도(double precision) 부동소수점 수다. 기본 정밀도는 32비트를 사용하고 2배 정밀도는 64비트를 사용한다. 비트를 2배나 더 많이 사용하기 때문에 비용이 더 들지만 정밀도는 훨씬 크다.

기본 정밀도 부동소수점 수를 단정도 실수,
2배 정밀도 부동소수점 수를 배정도 실수라고 부르기도 한다.

IEEE 754 부동소수점 표현은 크게 세 부분으로 구성된다.
최상위 비트는 부호(sign)로 사용되며, 지수 부분과 가수 부분이 있다.

사진 출처: https://ko.wikipedia.org/wiki/IEEE_754

지수에 대해 부호 비트가 따로 존재하지 않는다. IEEE 754 설계자들은 편향된(biased) 지숫값을 사용해 지수에 대해 부호를 표현한다. 기본 정밀도인 경우 bias 127, 2배 정밀도인 경우는 bias 1023이다. 여기서 127, 1023의 의미가 궁금할 것이다.

단정도 실수(기본 정밀도 부동소수점 수)는 32비트를 사용하며 8비트를 지수 부분으로 사용한다. 따라서 0 ~ 255까지 표현 가능한 지수를 절반에 해당하는 127을 bias로 설정한다. 이 말은 지수에 127을 더해서 양수인 경우는 맨 앞 비트가 1이고 음수인 경우는 맨 앞 비트가 0이 될 것이다.

예를 들어, 지수가 -2라면 127 더하면 125이다. 이걸 8비트로 표현하면 01111101 이다. 맨 앞 비트가 0이 된다(음수). 반대로 지수가 3이라면 127 더하면 130이다. 이걸 8비트로 표현하면 10000010 이다. 맨 앞 비트가 1이 된다(양수).
이해가 됐으면 좋겠다..

마무리

IEEE 754에서 편리한 점은 0으로 나눴을 때 생길 수 있는 양의 무한대나 음의 무한대를 표현하는 비트 패턴 등 여러 가지 특별한 비트 패턴을 제공한다. 이런 비트 패턴 중에는 수가 아님(not a number)라는 뜻의 NaN을 표현하는 특별한 값도 있다. 이로 인해 부동소수점 수로 계산을 하던 도중에 NaN 값이 생기면 뭔가 잘못된 산술 연산을 수행했다는 뜻이다.
profile
FE developer

0개의 댓글