본문 바로가기

C 언어/임베디드 C

실수 저장방식


 

float(IEEE754, single precision)은 부호비트가 1비트, 지수가 8비트, 가수가 23비트이므로 총 4바이트(32비트)이다.


10진수 0.345를 예로 2진수로 다시 바꿔주면 0.0101 1000 0101 0001 1110 1011가 된다.


처음비트는 +-를 결정하는 signed bit이며 0은 양수, 1은 음수로 표현한다.


위의 2진수 값을 정규화 시키려면 1.01 1000 0101 0001 1110 1011 * 2^ -2가 된다.

-2승은 소수점이 우로 2번 이동했기 때문이다.

1.01 1000 0101 0001 1110 1011 * 2^ -2에서 1을 제외한 나머지 값을 기수(Mantissa bit)라 한다.

01 1000 0101 0001 1110 1011을 23비트로 표현하면 0110 0001 0100 0111 1010 110이 된다. 0은 위의 2진수가 23비트가 안되므로 0으로 23비트까지 채운다.


그다음 지수를 구해야 하는데 지수는 -2승이므로 -2가 되지만 경우에 따라서는 지수가 양수일 수도 있다.

좌로 소수점이 이동하면 양의 승수, 우로 이동하면 음의 승수가 되는 원리다.

그러므로 8비트를 지수로 표현할 때 그냥 나온 승수 4를 저장하는 것이 아니라 8비트의 반 4비트를 즉, 0~255까지 표현 가능한 8비트를 가지고 반을 나누어서 127이 되는 값을 0승으로 표현규정 되어있다.

위에서 구한 승수에 127을 더하여 실제 승수를 만들면 지수 값은 -2+127=125가 된다.

음수 승이었다면 127보다 작은 값, 양수 승이면 127보다 큰 값, 0승이면 127


125를 2진수로 표현하면 0111 1101이다. 이 8비트 값이 지수로 들어가게 된다.


4바이트에서 최상위(31번 비트)부터

부호(1비트)+지수(8비트)+가수(23비트)이므로

0 0111 1101 0110 0001 0100 0111 1010 110


즉, 4비트로 모으면

0011 1110 1011 0000 1010 0011 1101 0110로 메모리에 저장하게 된다.

16진수로 표현하면 0x3eb0a3d6이 된다.


ex) 45000.67 저장했을 때의 모습

2진수로 표현하면 1010 1111 1100 1000.1010 1011(나머지 버리기)

0.67*2 = 1.34          1

0.34*2 = 0.68          0

0.68*2 = 1.36          1

0.36*2 = 0.72          0

0.72*2 = 1.44          1

0.44*2 = 0.88          0

0.88*2 = 1.76          1

0.76*2 = 1.52          1


가수

1.010 1111 1100 1000 (1010 1011)


지수

2의 15승

(바이어스 127)+15 = 142->1000 1110


부호+지수+가수

0 1000 1110 010 1111 1100 1000 1010 1011


그러므로 4비트로 모으면,

0100 0111 0010 1111 1100 1000 1010 1011


IEEE란

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


IEEE754란? 

컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준.

'C 언어 > 임베디드 C' 카테고리의 다른 글

플로우차트(흐름도)  (0) 2011.04.04
if문  (0) 2011.04.04
확장문자(escape sequence)  (0) 2011.03.30
ASCII(아스키 코드)  (0) 2011.03.30
gcc, cl 옵션  (0) 2011.03.29