✔ 학습목표
메모리 용량이 프로그램의 구동에 미치는 영향을 설명할 수 있다.
메모리
컴퓨터는 RAM(랜덤 엑세스 메모리)라는 물리적 저장장치를 포함하고 있다. 우리가 작성한 프로그램은 구동 중에 RAM에 저장되는데, 이는 유한한 크기의 비트만 저장할 수 있기 때문에 부정확한 결과를 내기도 한다.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// 사용자에게 x 값 받기
float x = get_float("x: ");
// 사용자에게 y 값 받기
float y = get_float("y: ");
// 나눗셈 후 출력
printf("x / y = %.50f\n", x / y);
}
그중 하나가 부동 소수점의 부정확성이다. 예시 프로그램을 보자.
이는 사용자에게 실수형 데이터 타입(float)으로 선언된 변수 x와 y를 받아 나눗셈 후 출력하는 프로그램이다. 출력 시에는 형식 지정자 %f 사이에 '.50'을 넣어 소수점 50자리까지 출력하게 했다.
만약 사용자가 x에 1, y에 10을 입력하면 정확한 결과는 0.1이 돼야 한다. 하지만 결과값은 다음과 같다.
x: 1
y: 10
x / y = 0.10000000149011611938476562500000000000000000000000
이러한 다소 부정확한 결과는 float에서 저장 가능한 비트 수가 유한하기 때문이다.
정수 오버플로우
정수 오버플로우도 오류 중 하나다. 예시 프로그램을 보자.
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for (int i = 1; ; i *= 2)
{
printf("%i\n", i);
sleep(1);
}
}
프로그램대로라면 값이 1에서부터 1초간격으로(sleep(1)) 2씩 곱하여 출력돼야 한다. 하지만 결과는 다음과 같다.
...
1073741824
overflow.c:6:25: runtime error: signed integer overflow: 1073741824 * 2 cannot be represented in type 'int'
-2147483648
0
0
...
for문에서 변수 i를 int로 저장하기 때문에, 2를 계속 곱하다가도 데이터 타입의 한계를 넘어가면 에러가 발생한다. 10억을 넘기자 앞으로 넘어갈 1의 자리가 없어진 것이다. int에서는 32개의 비트만 사용하기 때문에 그 이상의 숫자는 저장할 수 없다.
생각해보기
이러한 오류를 방지하기 위해서는 프로그램을 어떻게 설계해야 할까?
1) 충분한 메모리 공간을 확보한다(=> 하지만 메모리는 생각보다 비쌈, 메모리를 늘려야 한다면 교체 비용도 생각해야 함)
2) 프로그램을 개시하기 전 사전 테스트를 충분히 진행한다.
3) 오류 발생 시 사용자에게 알림이 가는 코드를 작성한다.
이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.
'Computer Science > Computational thinking' 카테고리의 다른 글
컴퓨팅 사고 | 디버깅 (0) | 2021.02.02 |
---|---|
컴퓨팅 사고 | 컴파일링 (0) | 2021.02.01 |
컴퓨팅 사고 | 알고리즘 (0) | 2021.01.29 |
컴퓨팅 사고 | 정보의 표현 (0) | 2021.01.29 |
컴퓨팅 사고 | 컴퓨터 과학과 2진법 (0) | 2021.01.29 |