과학이나 공학분야에서는 real number를 다룰 때, 아주 큰 값이나 아주 작은 값 등의 매우 큰 범위의 수를 다루는 경우가 많음. real umber(실수)는 사람의 계산에선 주로 분수를 사용하나 컴퓨터에서는 float를 사용하게 된다.
real number를 나타내는 float는 floating point number를 줄여 부르는 용어이며, 우리나라 말로 "부동소수점"이라고 한다.
(부동=floating : 떠다니는)
여기서 보이듯이 특정 길이(32bit or 64bit)의 binary nubmer로 소수를 표현할 때, 소수점의 위치가 고정(fixed)된 것이 아닌 지수(exponent)부 와 가수(mantissa or fraction)부로 나누어 표기하여 소수점의 위치가 변동된다. 이를 표현하는 (represent, or encoding) 규약이 바로 IEEE754이다.
Floating point number의 장점
- 고정소수점 방식에서 불가능한 매우 광범위한 수치를 표현가능 (단, 근사값임)
- 비록 근사값이나 precision(정확도)도 효율적으로 잘 유지함.
Mantissa (가수), Exponent (지수), and Base (기수)
- Mantissa : 표현가능한 유효 숫자에 해당함. precision을 결정.
- Exponent : 수치의 크기를 결정하게 됨.
- Base : 몇 진수인지를 표현.
10진수에서의 예를 보면 다음과 같음.
- 관측치 등의 표기에서 사용되는 Scientific notation에 익숙하다면 그리 어려운 개념이 아님.
IEEE 754
아래 그림처럼 정해진 bit 길이를 3부분으로 나누어 sign(부호), expoent, mantissa를 표현함.
많이 사용되는 변수형에 따른 bit 길이(bit size)와 구조를 표로 나타내면 다음과 같음.
변수형 | 크기 및 정확도 | 많이 사용되는 곳 | 구조 : 가로안은 할당된 bit수 |
---|---|---|---|
float (or float32 ) |
32bit single precision | memory | s(1) + e(8) + m(23) |
double (or float64 ) |
64bit double precision | memory | s(1) + e(11) + m(52) |
- | 80bit extended precision | Register | s(1) + 3(15) + m(63) |
- GPU등에서는 float32가 기본으로 많이 사용되고, CPU에서는 float64가 대세임.
Example
$-0.04$ 를 float32
로 나타내시오 (binary code로)
- 1번에서 보면, $-0.04$를 이진수로 표현하면 $-0.\color{red}{00001010001111010111}\dots$로 무한소수임. 여기서 붉은색의 숫자들이 반복된다.
- 이후, 2번과정에서 mantissa를 구하기 위해 scientific notation처럼 소수점 위에 유효숫자를 하나를 남기는 형태로 표현한다. 위 그림에서 녹색의 숫자들이 mantissa에 해당하며 23개의 bit에 해당함.
- 3번에서는 exponent를 구하는 과정으로 이진수이니 base가 2이고 지수(exponent)부분에서 $\text{bais} = - (2^{\text{bit_size_of_e}-1}-1)$를 더해서 2번에서 구한 지수부(위의 예제에선 $-5$)가 나오도록 exponent를 구함. 위의 예에서 bias는 exponent를 위해 할당된 bit수가 8이므로 $-(128-1)=-127$이되며, $-5=e-127$이므로 $e=122$(10진수표현)가 된다.
- 또한 sign은 negative이므로 sign은 1이 할당됨.
즉, 답은 다음과 같음.
$$1 01111010 01000111101011100001010$$
- 맨 앞의 1은 negative sign
- 이후 8자리는 -5승을 의미하는 exponent
- 나머지 23자리는 소수점 아래의 유효숫자에 해당.
Not a Number (NaN) 표현
IEEE754는 0으로 나누는 경우의 결과와 같이 숫자가 아닌 특정 결과도 표시하기 쉬움.
물론 양과 음의 무한대(infinty)도 표현이 간단하다는 장점을 가짐.
예를 들어 32bit 에서 NaN
은 다음과 같음.
s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
s
는 일반적으로 무시됨. (sign을 나타내는 비트이나NqN
에선 의미가 없음)x
는 non-zero number임. (infinity를 나타내는 경우엔 모두 zero)
exponent 부분이 모조리 1로 처리하여 NaN 또는 infinity를 표현.
Reference
https://ko.wikipedia.org/wiki/IEEE_754
'Computer > CE' 카테고리의 다른 글
[CE] Portable Document Format (PDF) (0) | 2023.01.02 |
---|---|
[CE] MapReduce (0) | 2022.12.30 |
[CE] 10진수 소수를 2진수로 변환. (0) | 2022.12.28 |
[CE] Micro Controller Unit (MCU) and Micro-computer (0) | 2022.12.18 |
[CE] Processor and Core (0) | 2022.12.18 |