티스토리 뷰

 부동소수점 연산 프로세서의 레지스터

정수 연산과 다르게 부동소수점, floating point 연산은 별도의 프로세서로 처리하게 됩니다.
즉 전용 레지스터 32개를 가지고 있습니다. 

알고있듯이 C언어 프로그래밍에서 float 자료형의 크기는 4바이트(32비트)이고
double 자료형은 8바이트(64비트) 입니다.

때문에 float 자료형을 사용할 때는 64비트 레지스터에서 하위 32비트를 사용하며
single S0 레지스터부터 S31 레지스터라고 칭합니다.

double 자료형을 사용할 때는 레지스터의 64비트를 전부 사용하며
D0 ~ D31 레지스터라 칭합니다.

 

 레지스터의 이진 구조

그렇다면 레지스터에 실수가 어떻게 저장되어 있을까요?

우선 이진수로 된 실수는 정규화된 형태로 저장됩니다. 

normalization form 

정규화된 형태란 다음과 같습니다.
$+-1.??? x 2^{+-?}$

때문에 이진수 구조에서는 실수부호, 가수부분, 지수부호, 지수부분 총 네 가지를 나타낼 수 있어야합니다.

single

single 32비트 구조는 다음과 같습니다.

MSB에 부호비트가 양수면 0, 음수 1 이 들어갑니다.

그 다음 8비트에 지수가 들어가고 나머지 23비트에 가수 부분이 들어갑니다.
정규화된 형태에서 1은 공통이므로 소수점 이하 부분이 가수부분에 들어갑니다.

지수의 부호가 들어갈 곳이 없다고 생각할 수도 있습니다.
이 부분은 뒤에 말씀 드리겠습니다.

double

마찬가지로 MSB 한 비트에 부호가 들어갑니다

그리고 11비트에 지수가 들어가고

나머지 52비트에 가수가 들어갑니다.

지수 표현법
지수는 일반적인 signed 표현법과 다릅니다. 
하드웨어 구조상 계산에 용이하도록 구성했다고 하는데 이해는 잘 안 갑니다.

예를 들어 000~111 까지 사용할 수 있다고 하면 최하위, 최상위 값은 제외합니다.
이 경우에서는 000과 111을 제외한 나머지 6개의 수를 표현할 수 있는 것이고
다음과 같이 사용합니다.

0 0 0  
0 0 1 -2
0 1 0 -1
0 1 1 0
1 0 0 1
1 0 1 2
1 1 0 3
1 1 1  
떠올리기 쉽게 설명하자면
(10진수 기준)표현하고 싶은 지수에 표현할 수 있는 가장 큰 값을 더해 2진수로 나타내면 됩니다.
ex) -2 를 나타내려면 -2에 3을 더한 1을 이진수로 나타내면 됩니다(0 0 1)

이를 single에 대입하면 -126부터 127까지 나타낼 수 있고
double에서는 -1022부터 1023까지 나타낼 수 있습니다.

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함