컴퓨터에는 RAM이라는 물리적 저장장치가 있다. 램에 작동한 프로그램들이 저장되어 작동하게 된다. 하지만 램은 4기가, 8기가, 16기가 등으로 저장용량이 유한하기 때문에 부정확한 결과를 내기도 한다.
아래 코드를 살펴보자
두개의 float 값을 받아 나눗셈을 연산한 후 소수점 50번째 자리까지 반올리하는 결과를 출력하는 코드이다.
x에다가 1, y에다가 10을 넣으면 1/10이기 때문에 0.100000....을 출력할 것으로 예상된다.
하지만 실제 결과값은?
뒤에 뭔가 이상한 숫자들이 나온다.
float 변수에 저장가능한 비트 수가 유한하기 때문에 발생하는 결과이다.
비슷한 오류로 "오버플로우"라는 것이 있다.
위의 코드는 1초 간격으로 2를 계속해서 곱한 수를 출력하는 프로그램이다.
1
2
4
8
16
....
이런 식으로 진행될 것으로 예상이 된다.
그렇게 계속 출력을 하다가 이런 에러가 나온다.
에러를 읽어보면 overflow : int 타입에 저렇게 거시기하게 큰 수는 나타낼 수 없다.
그러고 결과값은 계속 0이 나오게 된다.
2의 32승보다 더 큰 숫자를 넣으려고 하면 int는 그 숫자를 담지 못해 앞에서 담을 1이 없어져서 0을 출력하게 된다.
십진법으로 2 4 8 16 이렇게 되고 있지만
실제로 컴퓨터 내부에서는 1 10 100 1000 ...이런 식으로 커지고 있을텐데 1000....000(0이 32개)는 할당을 할 수 없기 때문에 더이상 그 숫자를 담지 못하고 맨 앞에 있는 1을 제외한 나머지 0들만 메모리에 저장되게 된다. 그래서 터미널에서는 계속 0만 나오게 된다.
오버플로우 문제는 실생활에서도 종종 발견된다.
1999년에 발생했던 Y2K 문제는 연도를 마지막 두 자리수로 저장했던 관습 때문에 99에서 00으로 정수 오버플로우가 발생하고 새해가 2000년이 아닌 1900년으로 인식된다는 문제였다.
결국 세계는 수백만 달러를 투입해서 프로그래머들에게 더 많은 메모리를 활용해서 이를 해결하도록 했다.
다른 사례로는 보잉 787에서 구동 후 248일이 지나면 모든 전력을 잃는 문제가였다.
소프트웨어의 변수가 248일이 지난 뒤에 오버플로우가 발생되어 강제로 안전 모드로 진입했다.
보잉을 설계할 때 사용한 변수보다 너무 커졌던 것이었다.
이를 해결하기 위해서 주기적으로 재가동하여 변수를 다시 0으로 리셋하는 과정이 필요했다.
오늘 배운 것
- 메모리는 유한하고 효율적인 프로그래밍은 중요하다
- 오버플로우 현상
'스터디 > CS50' 카테고리의 다른 글
하버드 CS50 2장 5) 사용자 정의 함수, 중첩 루프 (0) | 2023.01.25 |
---|---|
하버드 CS50 2장 4) 자료형, 형식 지정자, 연산자 (0) | 2023.01.15 |
하버드 CS 50 2장 3) 조건문과 루프 (0) | 2023.01.15 |
하버드 CS50 2장 2) 문자열 (1) | 2023.01.15 |
하버드 CS50 2장 1) C 기초 (0) | 2023.01.14 |