본문 바로가기

Embeded C

IEEE 754 표준 32비트 부동소수점 표현

 

IEEE 754 표준에는 32비트, 64비트, 43비트, 79비트에 대한 형식을 정의하고 있습니다. 이 표준은
현재 많은 프로그래밍 언어에서 실수형을 표현할때 따르는 표준이기도 합니다.

 

C/C++의 실수형 데이터형인 float, double에 적용된 32비트 부동소수점형식에
대해서만 알아보도록 하겠습니다.

 

 

32비트 부동소수점 표현         [ 값의 저장 범위 : 1.2E-38 ~ 3.4E38 ]

        

                지수부(8 Bit-126 ~ 128, Bias = 127)  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 부호비트 (1비트 양수 0 음수 1)                            가수부 (24Bit)

 

먼저 14.35 값을 정수부와 소수부를 분리해서 2진법으로 변환해야 합니다.

 

십진수 정수값인 14를 이진수로 변환하면 1110 입니다.

 

문제는 소수부 0.35값을 이진법으로 표현하는 것입니다. 소수형태의 값을 이진법으로 변환하는 방법은 해당값에 2 를 곱해서 그 결과 값이 1을 넘지 않으면 0, 결과 값이 1 이 나오면 1이라고 나타내고 변환 완료,
결과 값이 1을 넘으면 1이라고 나타내고 결과 값에서 1을 빼고 결과 값이 1이 나올때까지
이과정을 반복합니다.


0.35 을 가지고 계산해보면

 

  0.35 x 2 = 0.70   ->  0   : 1 을 넘지 않았음.
  0.70 x 2 = 1.40   ->  1   : 1 을 넘었음
  1.40 - 1 = 0.40              : 1 을 넘었기 때문에 1 을 뺀다.
  0.40 x 2 = 0.80   ->  0   : 1 을 넘지 않았음.
  0.80 x 2 = 1.60   ->  1   : 1 을 넘었음
  1.60 - 1 = 0.60              : 1 을 넘었기 때문에 1 을 뺀다.
  0.60 x 2 = 1.20   ->  1   : 1 을 넘었음
  1.20 - 1 = 0.20              : 1 을 넘었기 때문에 1 을 뺀다.
  0.20 x 2 = 0.40   ->  0   : 1 을 넘지 않았음.
  0.40 x 2 = 0.80   ->  0   : 1 을 넘지 않았음.
  0.80 x 2 = 1.60   ->  1   : 1 을 넘었음
  1.60 - 1 = 0.60              : 1 을 넘었기 때문에 1 을 뺀다.
  0.60 x 2 = 1.20   ->  1   : 1 을 넘었음
  1.20 - 1 = 0.20              : 1 을 넘었기 때문에 1 을 뺀다.
  0.20 x 2 = 0.40   ->  0   : 1 을 넘지 않았음.
  0.40 x 2 = 0.80   ->  0   : 1 을 넘지 않았음.
  0.80 x 2 = 1.60   ->  1   : 1 을 넘었음
  1.60 - 1 = 0.60              : 1 을 넘었기 때문에 1 을 뺀다.
  0.60 x 2 = 1.20   ->  1   : 1 을 넘었음
  ...  동일한 값이 계속 반복되기 때문에 생략  ...

 

결국 0.35 을 이진수를 변환한 값은 0101100110011.... 입니다.

 

따라서 14.35이라는 값을 이진수로 변환해보면 1110.0101100110011.... 입니다.


이제 이 값을  32비트 부동소수점 표현방식으로 바꾸어 보겠습니다. 먼저 이 값은 양수이기 때문에
"부호비트는 0" 입니다.

 

1110.0101100110011.... 값을 지수부와 가수부로 나누기 위해서는 이 값을 아래와 같이 2의 승수 형태로
표현해야 합니다. 현재 수의 표현방법이 이진법이기 때문에 2의 승수로 표시하는것입니다.
( 이진법이기 때문에 소수점이 오른쪽에서 왼쪽으로 1이동하면 2를 곱한것과 같습니다. )

  
  1 110.0101100110011...
      ←23(2의 3승)  : 앞으로 3칸이동

  1. 1100101100110011... * 23(2의 3승) 

 
위 표현에 따라
"가수는 1.1100101100110011...." 이고 "지수는 3"이 됩니다. 가수와 지수값을 알았으니 부동소수점 표현방식에 따라 지수와 가수를 저장해보겠습니다. 표현식에서 지수를 위한 8 비트가 먼저 나오는 관계로 지수를 저장하는 방법부터 설명을 하겠습니다.


지수는 3이고 이값을 이진수로 표현하면 11입니다. 지수를 위한 저장공간이 8비트인점을 고려하면 00000011 이라고 저장되겠죠. 하지만 이렇게 저장이 되지 않습니다. 왜냐하면 지수가 음수가 나올수도 있기 때문에 이렇게 저장하면 음수형태의 지수를 저장할수 없기 때문입니다.


결국 8비트의 저장공간에 음수 또는 양수 형태의 지수를 저장해야하기 때문에 8비트의 공간을 양수와
음수를 위해서 절반으로 나누게 됩니다. 8비트의 저장공간이 0 ~ 255 사이의 값을 저장할수 있는 크기이기 때문에 절반으로 나누어 127을 중간 값으로 정의되어 있습니다. 즉, 127이 0을 의미 하게 됩니다.

 

지수 0 이 127을 의미하기 때문에 현재 지수는 3이여서 127 + 3의 값으로 저장됩니다. 130을 이진수로 변환하면 10000010 이기 때문에 "지수부 8비트에 저장되는 값의 형태는 10000010" 이 됩니다.


이제 남은 23비트에 가수를 저장해보겠습니다. 가수는 형태적으로 볼때, 항상 1.???? 형식으로 표현되기 때문에 1. 은 제외한 나머지 부분만 저장합니다. 이렇게 하면 결국 1비트를 더 사용할수 있는 장점도 생깁니다. 위에서 구한 가수는 1.1100101100110011.... 이고 1. 을 제외한 1100101100110011....를 23비트에 저장하면 됩니다. 생략한 부분을 23자리까지 표시하도록 하면 다음과 같습니다.

 

"가수부 저장 형태  :  1100 1011 0011 0011 0011 001"


이것을 합치면
0 1000 0010 1100 1011 0011 0011 0011 001

문제)

45000.67


45000 = 1010 1111 1100 1000


0.67 = 1010101


0.67 x 2 = 1.34 1


0.34 x 2 = 0.68 0


0.68 x 2 = 1.36 1


0.36 x 2 = 0.72 0


0.72 x 2 = 1.44 1


0.44 x 2 = 0.88 0


0.88 x 2 = 1.76 1


0.76 x 2 = 1.56 1


 1010111111001000.1010 1011

 1.010 1111 1100 1000 1010 1011 x 2-15승


127 + 15 = 142  1000 1110                    


0 1000 1110 0101 1111 1100 1000 1010 1011






Institute of Electrical and Electronics Engineers(미국전기전자학회)


IEEE는 전세계 175개국에 36만여명에 달하는 기술직 전문가들을 회원으로 두고있는 비영리 단체로, 아이트리플이(Eye-triple-E)로 불리기도 한다.


1884년에 설립된 미국전기학회(AIEE: American Institute of Electrical Engineers)와 1912년에 설립된 무선학회(IRE:Institute of Radio Engineers)가 1963년에 현재의 명칭과 조직으로 합병하여 설립된 것으로, 세계 최대의 전기. 전자. 전기통신. 컴퓨터 분야의 전문가 단체이다.


회원으로 등록되는 기술직 전문가에는 컴퓨터 엔지니어, 생의학 전문가, 정보통신 전문가, 전력관련 업계종사자나 우주공학관련 기술자, 뿐만 아니라 소비전자제품의 생산에 관련된 엔지니어들이 포함된다.


IEEE의 활동은 통신, 컴퓨터 부품, 의학, 물리학, 원자물리학 등 다방면에 걸쳐 있고 3여개분야마다 독립적인 위원회에서 관련 기술의 표준화를 추진하고 있다.



'Embeded C' 카테고리의 다른 글

5_4 리눅스 make 명령어  (1) 2011.04.20
5_3 함수의 분리와 결합  (0) 2011.04.20
5_2 함수의 호출과 실행(작성중)  (0) 2011.04.20
5_1 함수  (0) 2011.04.19
4_3 포인터 변수  (0) 2011.04.19