본문 바로가기
프로그래밍/키워드 정리

[C++] 복습용 키워드 정리 - 8

by Sik.K 2023. 3. 29.

<정수, 실수>

 

정수와 실수는 수의 범위를 의미한다. 정수는 소수점 이하의 단위로 떨어지지 않는 수를 의미한다. 0 보다 큰 정수를 양의 정수, 0 보다 작은 정수를 음의 정수라고 하며 정수는 음의 정수와 양의 정수 그리고 0을 포함한다.

 

실수는 정수 보다 더 큰 개념으로 기본적으로 정수를 포함하고 소수점 단위로 넘어가는 수들을 포함한다.

 

프로그래밍에서는 정수는 보통 int 변수에, 실수는 float 변수에 담긴다.

 

<float>

 

float 변수는 소수점을 표기할 때 1.05f와 같이 표기한다. 맨 뒤에 있는 f는 무엇일까?

 

이는 저 숫자가 담기는 변수가 float형 변수임을 표시하기 위해 사용한다. f를 빼버리면 8바이트 실수 변수인 double을 선언한 것과 같은 효과가 나타난다.

 

<부동소수점>

 

컴퓨터는 자료를 0과 1의 이진법으로 저장한다. 일반적인 정수의 경우 int 변수에 담게 된다면 가장 앞의 자리는 음수와 정수를 나타내는 자리가 되며 그 뒤가 실제 수를 의미한다.

 

그렇다면 실수를 담을 경우에는 어떤 식으로 사용될까?

 

float 변수는 4바이트, 32비트의 자료형이다. 실수를 표현할 때 제일 앞의 자리는 부호부, 즉 음수인지 양수인지를 판별하는 자리이다. 양수이면 0, 음수이면 1이 들어간다.

 

그 다음 8비트는 지수부이며 지수를 나타내고 마지막 23비트를 가수부라고 하여 유효숫자를 나타내는 자리로 사용한다.

 

부동소수점

 

만약 214.152의 숫자를 부동소수점으로 표현하면 어떻게 변할까.

 

우선 양수이기 때문에 가장 앞자리는 0이 된다.

 

다음 실수의 절댓값을 2진수로 표현한다. 214.25를 2진수로 바꾸면 다음과 같다.

 

11010110.01

 

이 숫자를 정규화하면 1.101011001 * 2^7이 된다.

 

이때 소수점 오른쪽 자리의 수를 전부 가수부에 앞에서부터 차례대로 입력하고 남는 공간은 전부 0으로 채운다.

 

가수부에 숫자가 저장이 된 후에 지수부에 수를 입력하면 끝이 나는데 지수는 7이다. 지수 7에 bias 값 127을 더하고 이 숫자를 2진수로 변환한다.

 

134를 2진수로 바꾸면 10000110이다. 이 숫자를 가수부에 채운다.

 

그럼 최종적으로 214.25라는 숫자를 부동소수점으로 표현하면 다음과 같다.

 

0 (부호부) 10000110 (지수부) 101011001 (가수부의 유효숫자) 00000000000000 ( 남는 공간 )

 

예전에는 고정소수점 방식을 사용했지만 표현할 수 있는 숫자의 범위가 적어 현재는 부동소수점의 표기방식을 사용한다. 하지만 이도 정확하지는 않아 오차가 존재한다.

 

<오차범위>

 

실수를 변수에 담아도 이 값이 정확하지 않다. 0.3의 숫자는 2진수로 바꾸면 무한히 숫자가 반복되는데 이러한 이유 때문에 변수에 담을 경우 소수점을 절삭하여 담는다. 이 과정에서 잘리는 숫자가 생기게 되고 이로 인해 오차범위가 생긴다.

 

실수 변수는 어느 변수가 큰 지, 작은 지를 비교하는 것은 가능하지만 서로가 같냐는 비교는 할 수 없다. 표기상 같은 0.1이라고 하여도 내부에서 오차범위가 생겨 실수 변수끼리의 비교 연산은 == 을 사용하지 않는 것이 좋다.

 

<부동소수점의 장/단점>

 

부동소수점은 우선 정수와 정수 사이에 있는 값, 즉 소수를 담을 수 있다는 장점이 있고 스케일을 사용하여 매우 큰 범위의 값을 나타낼 수 있다.

 

하지만 단점으로 연선 보조 프로세서가 없는 컴퓨터에서 속도가 느리다. 때문에 남용할 경우 전체적인 속도 저하를 가져온다.

댓글