보통 수를 표현할때는 아래와 같이 표현한다
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가 될 것.
이것을 컴퓨터 상에서는 아래와 같이 표현한다.
(사진출처 : 위키백과)
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 |