컴퓨터에는 모든 데이터를 0
과 1
의 디지털 신호로 나타냅니다. 숫자도 마찬가지인데요. 정수는 단순히 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
형식으로 나타내는 것을 의미합니다.
정규화
는 다음과 같은 공식으로 수행합니다.
1.ㅁㅁㅁ...
형식으로 표현이 가능하도록 지수를 조정한다.2^n
에서 지수 n을 채운다. 오른쪽으로 밀면 +
, 왼쪽으로 밀면 -
- 가수 표현에서 항상 일의 자리가
1
이기 때문에 실제 표현에서는 1을 생략하고.ㅁㅁㅁ...
만 표현합니다.- 0이라면 가수를 모두 0으로 채웁니다.
하나의 예시로 직접 정규화
를 수행해보겠습니다.
2진수
1100.01
을 정규화 합니다.
- 일의 자리 1만 남기고 숫자를 소수 부분으로 넘깁니다.
1.10001- 밀어낸 자릿수에 따라 지수를 적습니다. (3칸 오른쪽으로 밀었으므로 지수는 +3)
2진수0.001101
을 정규화 합니다.
- 일의 자리가 1이 되도록 소수를 왼쪽으로 밀어냅니다.
1.101- 밀어낸 자릿수에 따라 지수를 적습니다. (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 / ±0 | NaN |
∞ - ∞ | NaN |
±∞ / ±∞ | NaN |
±∞ × 0 | NaN |