C++에서 실수를 표현할수있는 자료형은 크게 float과 double이 있다.
float과 double은 각각 4byte,8byte의 크기를 가지고 있는 데이터 타입인데. 앞서 얘기했던 정수 표현방식과
다르게 컴퓨터는 실수를 받아들일때 부동소수점 방식으로 실수값을 저장하게된다. 부동 소수점 방식이란.
예를들어 우리가 아래 처럼 flaot A = 21.8125라는 값을 집어넣었다고 가정 해보자
컴퓨터는 float형 변수 A를 저장하고 읽어 들일때 부동 소수점 방식을 활용해서 실수를 구분하게 된다.
21.8125라는 실수 값을 정수부분인 21과 소수점 아래 부분인 8125로 나눠서 2진수로 변환해보자.
21은 위에 그림처럼 10101이라는 수로 변환할수 있을것이다. 그렇다면 실수부분인 8125는 2진수로 어떻게 나타낼까?
실수는 아래부분을 계산할때 1/2^n이라는 공식을 활용해 값을 계산할수있는데 그이유를 설명하기위해 우리가 사용하는 10진수를 예로들어 생각해보겠다.
10진수 10은 다르게 표현하면 1x10으로 표현할수있다. 즉 1이 10개가 모여서 10이된다는 사실을 알수 있을것이다.
그렇다면 2진수 10은 어떻게 될까?
2진수 0이 10이 되려면 1이 2개가 있어야 다음 자리로 넘어가 10이라는 숫자가 된다. 10은 10진수로 표현하면 2이다.
이처럼 2진수가 다음 자리수(비트)로 넘어가기위해선 2가 필요하다는 점을 알수있다.
1이 되기위해서 2개가 필요하다는것은 즉 1/2 = 0.5를 나타내게 된다. 이 원리를 사용하여 21.8125를 나타내면
21.8125 = 10101.1101이 된다. 1101이 되는이유는
소수점 아래부터는 1/2^n이라는 공식을 통해 0.5,0.25,0.125,0.0625라는 값을 가지게 되는데
0.5 + 0.25 + 0.0625 = 0.8125가 성립하기 때문에 해당하는 값을 가진 2진수 1101이 = 0.8125가 되는것이다.
앞서 우리는 21.8125 = 10101.1101이 된다는 것을 알수있게 되었는데 이것을 정규화 방식으로 나타내면
0.101011101 x 1/2^5가 됨을 알수있다. 부동소수점 방식은 아래그림처럼 이뤄져있는데 앞서 구한 값을
부동소수점 방식으로 나타내면
00000010110101110100000000000000이 되는것이다 최종적으로 보기쉽게 정리하자면float 데이터 타입은 4byte의 크기를 가지므로 총 32bit에 크기를 가지게 되고.이후 32비트에 맨앞 1비트는 부호를, 8개는 지수를, 나머지 23개는 가수를 나타내게된다 따라서<0> ( 00000101 ) [10101110100000000000000]이 되는것이다.<> -> 부호, () -> 지수, [] ->가수
이처럼 컴퓨터에서 실수 데이터 타입을 계산하는 방식과 정수 데이터 타입을 계산하는 방식은 전혀 다른 방식으로 이뤄져있음을 알수있다 .
그렇기 떄문에 컴퓨터는 정수 + 실수의 계산을 할때 저장되는 데이터의 자료형이 어떻게 되냐에따라 계산 방식이 바뀌게 된다 위 사진처럼 float a에 1+ 3.0을 하는경우 컴퓨터는 1을 실수형 데이터로 변환한뒤 3.0과의 연산을 하게 되는 셈이다.
그러므로 우리는 프로그램 작성시 좀 더 명확하게 이 사실을 보여주기위해 정수와 실수 계산시 (float)과 같이 형변환 사실을 명시하여 코드를 짜는 것이 좋다.
혹은 원하는 결과값이 크게 다르지 않다면 정수 + 정수처럼 같은 데이터 방식으로 원하는 계산값을 도출해 내는것이 컴퓨터 입장에서 연산을 두번 안해도 되는일이기 때문에 훨씬 나을수 있다는 것이다.
또한 컴퓨터는 이러한 방식으로 실수를 계산하기때문에 무조건 정확한 실수값이 아닌 원하는 수와 가까운 근사값으로 데이터 저장하고 있을 수 있다. 그러므로 예를 들어 우리가 조건문 if(n == 1f)에서, 여기서 n은 임의의 변수이다.
값이 1f가 사실 1이 아니라 0.9999999998 처럼 근사값일 수가 있어 조건문이 성립 안할수 있다는 것이다.
분명 논리적으로는 1이 맞는데 컴퓨터가 표현할때 1을 근사값으로 표현하게 되어 결국 비교 연산을 했을때 두 수가 같지 않다고 볼수있다는 것이다.
이러한 실수형데이터의 특성을 알고 코딩하는것이 중요하다고 볼수 있다.
'C++' 카테고리의 다른 글
C++ 비트 연산자 (&, |, ^, ~) (2) | 2023.11.04 |
---|---|
C++ 비트 연산(시프트 연산) (0) | 2023.11.04 |
C++ 정수 자료형 (0) | 2023.11.02 |
비주얼 스튜디오에서 C++ 프로젝트 생성하는 법 (0) | 2023.11.02 |
게임 개발에서 C++이 중요한 이유 (0) | 2023.11.02 |