-
실수를 비트로 표현하는 방법, 부동소수점전공/시스템프로그래밍 2020. 6. 8. 03:33
int a = 3; 을 32비트로 표현하면 어떻게 될까.
십진수 3을 이진수로 바꾸면 011이다.
이 값을 32자리 중 가장 끝자리에 위치시킨다.
□□□□□...(29개의 빈칸□)011
그렇다면 float b = 6.25; 일 때 실수 b를 32비트로 표현하려면?
'부동소수점' 방식을 활용하여 각 비트를 채워야한다.
32비트는 32개의 칸(□)으로 이루어져있다.
이를 부동소수점으로 표현할 때는 구간별로 특징이 존재한다.
□ □□□□□□□□ □□□□...(23개의 빈칸)□□□
가장 높은 수를 나타내는 한 자리는 부호 비트를 나타낸다.
중간의 8자리는 지수를 나타내는 부분이다.
나머지 23자리는 가수를 나타내는 부분이다.
간단히 예시를 들어 설명해보겠다.
-118.625 를 부동소수점 방식으로 표현해보자.
먼저, 정수부와 소수부를 이진수로 바꿔보자.
정수부는 1110110이고, 소수부는 101이 된다. (0.625 * 2 = 1.25, 0.25 * 2 = 0.5, 0.5 * 2 = 1.0)
즉, 1110110.101이 된다.
여기서 부동소수점 방식으로 변경하려면 정수부의 가장 높은 자리수(1)를 제외하고 모두 소수점으로 보낸다.
1110110.101 → 1.110110101 로. 그리고 감소된 자리수만큼 2를 곱해준다.
따라서 1110110.101 → 1.110110101 X 2^6 이 나오게 된다.
자 이제 해당되는 비트에 값을 넣어주면 된다.
부호는 음수이므로 부호 비트에 1을 넣어주고,
지수는 6이므로 이진수로 변경해서 110을 넣어주고,
가수부에는 110110101 을 왼쪽에 순서대로 넣고, 나머지는 0으로 채우면 된다.
라고 하면 완벽히 틀렸다 ㅋㅋㅋㅋ 다른 부분은 맞는데 지수부에 넣는 값이 틀렸다.
제대로 계산하려면 bias(바이어스) 상수를 추가해야 한다.
8비트에서 표현가능한 수의 개수는 2^8 = 256개이다.
여기서 양수, 음수를 나누면 -128 ~ 127의 정수값을 표현할 수 있다.
이때, 127을 bias 상수라고 하며, 이 값 실제 지수값인 6과 더해 이진수로 변환한 뒤, 삽입해야 한다.
즉, 지수 6 + 바이어스 127 = 133을 이진화한 10000101 을 지수부에 넣으면 된다!
따라서 -118.625 를 비트로 표현하면
1 10000101 110110101 이 된다!!
조금 더 예쁘게 보려면
이 된다.
'전공 > 시스템프로그래밍' 카테고리의 다른 글
바인딩(Binding), 바인딩 타임(Binding Time) (0) 2020.06.08 인텔 프로세서의 내부 구조 (1) 2020.06.08 SISD / SIMD / MISD / MIMD (0) 2020.06.08 연산 단위, 컴퓨터 조직, 명령어 실행의 4단계 (0) 2020.06.08 링커, 로더, 번역기(Translator), 프로그램 실행과정 (0) 2020.06.06