본문 바로가기

CS ﹒ Algorithm/Computer architecture

컴퓨터구조 (3) 이진 실수 표현법(부동 소수점) / 8진법 / 16진법 / BCD / 구별법

 

 

1. 실수 표현법

 

(1) 고정 소수점 표현법

 

비트에서 항상 고정된 위치에 소수점을 표기하는 방식으로, 만약 4비트라면 앞의 2비트는 정수 뒤의 2비트는 분수의 거듭제곱으로 사용한다.

소수의 위치가 항상 일정하기 때문에 고정 소수점(fixedpoint)표현법이라고 부른다.

 

좌 2진법, 우 10진법

 

실수값 표현을 위한 비트 낭비가 너무 심해서 일반적으로는 거의 사용되지 않으며 디지털 신호 처리장치(DSP) 등 특별한 목적의 컴퓨터에서만 일부 사용한다.

 

 

(2) 부동 소수점 표현법

 

과학적 표기법(scientific notation)이 적용된 방법으로써, 10진 소수점이 왼쪽 한 자리 뿐인 소수(가수)에 10을 몇 번씩 곱하는지(지수)로 소수를 표현한다.

10진수로 예를 들자면 아래와 같은 표현법이다.

 

 

 

 

그러나 부동소수점 표현법은 0만 4가지로 표현하여 비트 조합이 엄청나게 낭비되고, 비트 패턴이 가능한 모든 수를 표현하지 못한다.

지수가 커질 수록 가수의 한 패턴과 다른 패턴 사이의 값이 커진다. 이 부동 소수점 표현법은 우리가 흔히 알고 있는 그 부동 소수점이 아니다.

 

 

 

(3) IEEE 부동 소수점 표준

 

미국 전자전기공학회(Insitute of Electrial and Electronic Enginners)에서 정한 방법으로, 위의 부동 소수점 표현법보다 정밀도를 증가시키고 가수를 조정해서 맨 앞(좌측)에 위치한 0을 제거했다.

이 방법이 현재 표준으로 사용되고 있으며, 기본 정밀도(single precision) 소수점과 배 정밀도(doble precision) 부동 소수점이 주로 사용된다. ( = 단정도 부동 소수점, 배정도 부동 소수점, 단정도 부동실수, 배정도 부동실수.. )

 

 

 

특수문자 쓰기 귀찮아서 손으로 썼다.

 

배정도의 수가 단정도의 수보다 지수가 3비트 더 크며, 따라서 지수 범위가 8배 더 크다.

부동소수점은 사실 아무것도 모르고 자바에 입문한 사람들이 책에서 제일 먼저 접하고 괴로워하는 것들 중에 하나인데 (물론 거기서 이해하고 넘어가도 쓸 일이 없다보니 잊어버린다.)

 

https://m.blog.naver.com/08482/221518500138

 

부동소수점 제일 쉽게 이해하기

정처기 공부할 때 부동소수점 이해하기가 힘들었는데 아래 글 덕분에 한 번에 이해할 수 있었다 작성자님 ...

blog.naver.com

나는 해당 블로그 글을 통해 아주 쉽게 이해할 수 있었다.

부동 소수점이 너무 어려우면 읽어보자.

 

참고로 부동 소수점의 지수부에서 특정 값은 수가 아닌 특별한 의미를 갖는데, 대표적으로 NAN이나 infinity가 있다.

자바에도 infinity가 있는지 모르겠는데, 자바스크립트에서는 자주 만나볼 수 있다.

이 또한 다른 블로그에 더 자세하게 설명되어 있으니 궁금하다면 한 번 읽어보자.

 

https://nybounce.wordpress.com/2016/06/24/ieee-754-floating-point%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90-%EC%82%B0%EC%88%A0%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC/

 

[IEEE 754] floating-point(부동소수점)에 대하여

IEEE 754는 IEEE에서 제정한 floating point(부동소수점)을 표현하는것에 대한 기술표준이다. 글을 쓰는 현재의 최신 version은 2008년 8월에 제정한 IEEE 754-2008이다. 이전에는 IEEE 754-1985는 binary floating point

nybounce.wordpress.com

 

 

 

 

 

 

2. 8진 표현법

 

 

2진법은 밑이 2, 10진법은 밑이 10이니까 8진법은 밑이 8인 표현법이다.

2진수를 3자리씩 묶어서 표현하게 된다. (111이 8이라는 것을 기억하자)

하지만 컴퓨터의 내부가 8비트의 배수를 사용해서 만들어지는 현재 시점에서는 8진법은 거의 사용되지 않는다.

8진법은 3비트씩 사용하기 때문에 8비트의 배수를 균일하게 나눌 수 없다.

 

 

 

 

 

 

3. 16진 표현법

 

지금까지는 2가 밑, 10이 밑, 8이 밑이였는데 이제는 16이 밑이다.

문제는 우리가 한자리에 표현할 수 있는 숫자는 9가 최대라는 것이다.

따라서 10부터 15까지는 a~f로 표현한다. 이건 그냥 약속일 뿐 아무런 의미도 없다.

 

 

 

 

 

 

4. 프로그래밍 언어에서의 진법 표기법(구별법)

 

여기까지 오면 이런 생각이 들 것이다.

2진법의 1111과 10진법의 1111을 어떻게 구별하지?

24가 8진법의 24인지 16진법의 24인지 어떻게 구별하지?

 

비트를 숫자로 표현하는 것은 단순한 약속이기 때문에, 이를 표기하는 것에도 약속이 있다.

(1) 0으로 수작하는 숫자는 8진수이다. (017은 8진수, 17은 10진수)

(2) 1부터 9 사이의 정수로 시작하는 숫자는 10진수이다. (1111은 10진수이다.)

(3) 0x가 앞에 붙은 숫자는 16진수이다. (0x12는 16진수이며 10진법으로 표현하면 18이다. )

(4) 0b가 앞에 붙은 숫자는 2진수이다. (0b0010은 2진수이며 10진법으로 표현하면 2이다.)

 

 

 

 

 

 

5. Binary-Coded Decimal(BCD 표현법)

 

BCD 표현법은 상당히 재미있는 친구지만 약간 사파 같은 친구라서 때문에 마지막으로 넣었다.

이름 그대로 바이너리 코드화한 10진수 시스템이라는 뜻인데, 4비트 한 뭉텅이가 각 10의 자리 수를 의미한다.

예를 들면 0001 0010은 각각 1, 2가 나오기 때문에 이것은 12다.

만약 이 표현법을 사용했다면 우리가 2진수를 머리로 계산하기는 아주 편했겠지만 기존 2진 표현법에 비해 37%의 비트를 낭비하게 되어 컴퓨터는 굉장히 불편해했을 것이다.

그러나 현대에도 가속도 센서나 디스플레이 등 BCD를 사용하는 영역이 존재한다.