보통 수를 표현할때는 아래와 같이 표현한다

123, 123.123, -123


하지만 지수를 이용해서 수를 표현할 수 있다.

1.23 x 10², 1.23123 x 10-², -1.23 x 10²


이런 방식을 부동 소수점 표현이라고 한다.

f x b^e


f는 가수 b는 밑, e은 지수라고 한다.

123의 경우 1.23은 f, 10은 b, e는 2가 될 것.


이것을 컴퓨터 상에서는 아래와 같이 표현한다.


General floating point ko.svg

(사진출처 : 위키백과)


float의 경우 부호비트가 1비트, 지수가 8비트, 가수가 23비트로 총 32비트 = 4바이트를 차지한다.

double의 경우 부호 1비트, 지수 11비트, 가수 52비트로 총 64비트 = 8바이트를 차지.


부호비트에는 양수면 0, 음수면 1이 들어가고, 지수와 가수는 각각의 자리에 들어가게 된다.



1. 123의 경우 이진수로 바꾸면 1111011이 됨

이걸 위와 같은 방식으로 나타내면 1.111011 x 2⁶이 된다.

이렇게 1.xxxx로 바꿔주는 과정정규화(Normalization)라고 한다


양수이므로 부호비트는 0,

지수는 6 (소수점이 몇번 옮겨갔는지를 보면된다. = 쉬프트연산을 몇번했느냐)

가수는 xxxx자리인 111011이 들어가게 된다.


즉 0 00000110 11101100000000000000000 이 저장되게 되는것.

하지만 여기서 끝이 아니다.


지수에는 바이어스(Bias)처리를 해주는데 지수에 2^(e-1)-1 만큼의 값을 더해주는 것이다.

이것을 왜 더해주냐면 0.625같은 소수는 이진수로 바꾸면 0.101인데 

정규화하면 1.01 * 2^-1이 되고 지수가 -1. 즉 음수가 되버린다.


지수에 음수를 표현하려면 마찬가지로 부호비트가 하나 필요하게되는데

컴퓨터 기술자들이 부호비트대신 바이어스처리를 해 무조건 양수가 되도록 만든것이다.

그렇기에 float은 지수를 -127 ~ 127까지만 표현이 가능하다.


그래서 지수 6에 바이어스처리를 하면 6 + 127 = 133이 되어 10000101이 된다.

즉 0 10000101 11101100000000000000000 이 저장되게 된다.




2. 마찬가지로 -118.625를 이진수로 나타내면 1110110.101이 된다.

이것을 정규화하면 1.110110101×2⁶


음수이므로 부호비트는 1

지수는 6이므로 바이어스처리를 하면 133 = 10000101

가수는 110110101


즉 1 10000101 11011010100000000000000 이 저장된다.


'프로그래밍 공부 > C++' 카테고리의 다른 글

A* 알고리즘 / 최단경로탐색  (0) 2018.07.10
STL (standard template library)  (0) 2018.03.21
템플릿(template)  (0) 2018.03.21
2중 포인터  (0) 2018.03.21
콘솔 미니 RPG게임 (상속 예제)  (1) 2018.03.21
Posted by misty_
,