안녕하세요, C 프로그래밍 언어 열네번째 강의입니다.
오늘도 변수, 그 중 실수형 변수를 컴퓨터가 어떻게 저장하는지에 대해 알아보겠습니다.
실수의 정의는 유리수와 무리수를 합친 숫자의 범위를 말합니다.
쉽게 설명하여, 정수를 포함하여 소수점을 가지는 숫자들을 생각하시면 됩니다.
본래 실수는 무한대의 소수점을 가질 수 있습니다.
하지만 컴퓨터가 저장할 수 있는 용량의 한계가 있기 때문에 무한대의 소수점은 생략하겠습니다.
우리는 여태까지 변수를 선언하기 위해서 int를 사용하였습니다.
하지만 int는 지난 강의에서 배웠듯이 정수형 변수를 선언하기 위한 자료형입니다.
하지만 실수형 변수를 선언하기 위해서는 float 혹은 double이라는 자료형을 사용해야합니다.
float와 double이라는 단어는 아래 슬라이드에서 설명드리겠습니다.
float형 변수는 총 32비트의 저장 공간을 가집니다.
double형 변수는 그 2배인 64비트의 저장 공간을 가집니다.
float형보다 double형이 더 많은 범위의 숫자를 표현할 수 있겠죠?
바로, 컴퓨터가 실수를 어떻게 저장하고 있는지 알아보겠습니다.
대부분의 컴퓨터에서는 실수를 효율적으로 저장하기 위해서 부동 소수점이라는 방식을 사용합니다.
부동 소수점은 영어로 floating point이기 때문에 우리는 float라는 이름으로 변수를 선언한겁니다.
부동 소수점 방식은 많은 과학분야에서 사용되며 적은 숫자를 이용해 넓은 범위의 실수를 표현할 수 있습니다.
32비트 중 가장 왼쪽의 비트는 부호를 의미하며, 다음 8비트는 e, 나머지 23비트는 f를 의미합니다.
이 세가지 숫자를 조합하여 매우 넓은 범위의 실수를 표현할 수 있습니다.
하지만 부호 비트와 f, e를 이용해서 숫자 0을 표현할 수 있을까요?
소수점 부분을 표현하는 f를 이용해서는 0을 만들 수 없습니다.
2의 몇 승을 하던 후자도 절대 0을 만들 수 없습니다.
위의 부동 소수점 방식을 이용해서는 0을 표현할 수 없습니다.
그렇다면 우리는 컴퓨터에서 0을 사용할 수 없을까요?
자주 사용하게 되는 0을 위해 컴퓨터는 모든 비트를 0으로 만든다면 이것을 숫자 0으로 하기로 약속을 하였습니다.
이 숫자는 0이 아니지만 컴퓨터는 0을 표현하기 위해 예외로 처리하였습니다.
이때 문제점은 사칙 연산을 통해 결괏값이 0이 나와야한다면?
애초에 실수 타입을 0으로 초기화한다면 컴퓨터는 모든 비트를 0으로 만들어 0을 표시할 겁니다.
하지만 0이 아닌 두 개의 실수가 있고, 그것을 수식을 통해 연산할 때 문제가 됩니다.
컴퓨터는 두 실수를 정해진 비트와 연산 약속에 따라서만 판단하고 계산합니다.
히지만 그 결괏값이 0인 경우 어떻게 될까요?
컴퓨터는 이 결괏값이 실제로 0인지, 그냥 그에 가까운 숫자인지 판단하지 못하고, 그에 가까운 결괏값을 표현합니다.
하지만 0과 그에 가까운 숫자의 차이가 크지 않음으로 대부분 사용자는 무시하고 넘어가게 되지만, 그것이 오래 쌓이다보면 큰 문제가 되기도 합니다.
이번 시간은 이러한 부동 소수점의 문제점만 인지하고 넘어가시고 혹 나중에 문제가 된다면 다시금 복기하겠습니다.
'Computer Science > C' 카테고리의 다른 글
Chapter 15. 비트 연산자 (0) | 2018.05.01 |
---|---|
Chapter 13. 정수 표현법 (0) | 2018.04.26 |
Chapter 12. 진법 (0) | 2018.04.24 |
Chapter 11. 연산자 우선순위 (0) | 2018.04.19 |
Chapter 10. 연산자 실습 (0) | 2018.04.18 |