고정소수점과 부동소수점 명칭의 이해
고정소수점 | 부동소수점 |
-Fixed point, 固定(굳을 고, 정할 정)소수점 -영어, 한자어 표현에서도 알 수 있다시피 움직이지 않고 고정된 소수점을 뜻한다. |
-Floating point, 浮動(뜰 부, 움직일 동)소수점 -이 역시 영어와 한자어 표현을 통해 직관적으로 의미를 이해할 수 있다. 고정되지 않고 움직이는 소수점을 뜻한다. -사전을 찾아보면 유의어로 '이동소수점'이 나온다. |
소수점이 고정되어 있는 것과 그렇지 않은 것으로 구분되어 있는 것이 아니다. 고정소수점과 부동소수점은 소수점 아래 숫자가 있는 실수들을 표기하는 방식의 명칭이다. 보다 정확한 명칭은 '고정소수점 표현'과 '부동소수점 표현'이다. 이들은 컴퓨터 내에서 수들을 취급하는 방법이기에 2진수를 다룬다. 하지만 이해를 돕기 위해 10진수를 이용해 예를 들어보면 다음과 같다.
고정소수점: 123.456 부동소수점: 1.23456×10^2=0.00123456×10^5=12.3456×10 ... 등 |
같은 수이지만 부동소수점은 과학적 표기법(Scientific Notation, 과학적 기수법)에 따라 표현한 것이다. 규칙을 찾아 정리해보자면, 아래와 같이 나타낼 수 있다.
R=±m×10^n (n은 R을 m으로 만들 때 소수점을 이동한 칸 수.) |
방식은 2진수를 다룰 때도 마찬가지이다. 이때 부동소수점은 IEEE 754 표현에 따라 m은 1.XXXX의 형태로 만들기로 정해져 있다.
R=±m×2^n |
이제 위 설명들을 바탕으로 21.25라는 10진수를 2진수 부동소수점으로 표현하는 과정을 정리해보겠다.
① 10진수 21.25를 2진수로 바꾼다. |
고정소수점과 부동소수점의 컴퓨터 내부에서의 표현 방식
고정소수점, 부동소수점 모두 32비트일 때의 상황으로 정리할 것이다.
1. 고정소수점
고정소수점은 첫 번째 칸을 부호비트, 그 다음 15칸은 정수부, 16칸은 소수부라고 부른다. 명칭 그대로 부호비트는 실수의 부호를 나타내는 비트 자리로 실수가 음수라면 1을, 양수라면 0을 넣는다. 그리고 정수부에는 실수의 정수 부분을, 소수부에는 실수의 소수부분을 넣는다. 정수부와 소수부의 경계 부분을 소수점의 위치로 생각하고 수를 그대로 넣으면 된다. 숫자들을 넣고 남은 칸들은 모두 0으로 채워진다.
21.25를 예를 들어 표현하면 다음과 같다. 21.25는 위 설명에서 10101.01로 구한 바 있다.
부호비트: 0 (10101.01이라는 실수는 양수이기 때문이다.) |
이들을 구한 뒤 아래 그림과 같이 넣어주면 된다.
그리고 남은 부분은 모두 0으로 채우면 끝이다.
2. 부동소수점
부동소수점 역시 첫 번째 칸은 부호비트이다. 다만 그 다음 8칸은 지수부, 나머지 23칸은 가수부이다. 부호 부분엔 실수가 음수일 경우 1, 양수일 경우 0을 자리시킨다. 지수부는 위 설명에서의 n에 bias를 더한 값을 2진수로 변환한 수를 넣는 부분이다. bias는 32비트에서는 127, 64비트에서는 1023이다.
bias에 대한 자세한 설명은 이후 새 글을 작성하여 다룰 예정이다.
가수부에는 가수를 넣는 부분인데, 위 설명에서의 m의 소수점 아래 부분을 일컫는다.
21.25를 2진수로 변환한 10101.01을 예로 들어 그림과 함께 설명하면 다음과 같다.
부호비트: 0 (10101.01은 양수이기 때문이다.) |
그리고 남은 부분은 모두 0으로 채워주면 끝이다.
부동소수점의 의의
고정 소수점의 경우 정수부분와 소수부분으로 나누기에 정수부분이 일정 자릿수보다 큰 수는 다룰 수 없게 된다. 32비트의 경우, 정수 부분이 8비트가 넘어가는 수는 다룰 수 없게 되는 것이다. 하지만 부동소수점은 정수, 소수 대신 가수,지수로 다루기에 정수 부분이 8비트가 넘어가는 큰 수도 다룰 수 있다. 예를 들어, 1111101011.101이라는 수를 1.111101011101×2^9로 정규화하여 충분히 32비트 안에 표현할 수 있기 때문이다.
결론적으로 부동소수점은 고정소수점보다 큰 수를 다룰 수 있다는 데 의의가 있다.
'C' 카테고리의 다른 글
배열에서 최댓값 인덱스 찾기 (0) | 2021.06.02 |
---|---|
배열 (0) | 2021.06.01 |
확장열(Escape Sequence, 제어 시퀀스, 특수문자, 이스케이프시퀀스) (0) | 2021.01.14 |
데이터 타입 (0) | 2021.01.04 |
printf 함수 (0) | 2021.01.04 |