하드웨어의 한계

박상록(Sangrok Park)·2020년 11월 12일
0

Computer Science Basic

목록 보기
6/13
post-thumbnail

하드웨어의 한계

Ram: 프로그램이 작동할 때 모든 것들이 저장되는 곳.

하지만, 램의 성능은 유한.

예를들면, 수를 무한대까지 셀 수 없다. 그 뜻은, 연산에도 한계가 있다는 뜻.

형식지정자를 쓸 때, 정해진 소주점 자리 수 만큼만 나타내기

%.1f // 소수점 한자리
%.10f // 소수점 10번째 자리까지

이 때 1 / 10의 값을 소수점 50자리까지 프린트 해보면,

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    float x = get_float("x: ");
    float y = get_float("y: ");

    printf("x / y = %.50f\n", x / y);
}

희안하게도, 값이 1이 아니다.

이유는 뭘까?

컴퓨터 메모리 용량에 따라, 특정 값 이상을 계산할 수 없고, 특정 소수점 자리수 이상까지 저장할 수 없기때문.

float 대신 double을 썼다면 더 가까운 값을 표현했겠지만.

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    double x = get_float("x: ");
    double y = get_float("y: ");

    printf("x / y = %.50f\n", x / y);
}

컴퓨터는 완벽하지 않다. 그저 자신의 메모라 한계에서 가장 근사값을 찾아내는 것 뿐.

loop로 1에 2를 계속 곱해보자.

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    for (int i = 1; ; i *= 2)
    {
        printf("%i\n", i);
        sleep(1);
    }
}

결국에는 runtime error와 함께 리턴값으로 0이 나온다.

계속해서 숫자를 키워나가다보면, 더 이상 1조차 더할 비트가 없게 된다.

그 뜻은 컴퓨터는 소수점의 정확성, 정수의 크기에 한계가 있다는 뜻.

10진수에서 세자리 수까지만 쓸 수 있다면, 999 + 1은 뭐가 될까?

=> 000

그렇다면 2진수에서 3자리 까지만 쓸 수 있다면 2진수 111(십진수로 7)의 다음수는 뭐가될까?
=> 1000

하지만 "3bit까지만 쓸 수 있을때"로 가정해놨기에,여기서 111의 다음 수는 앞으로 가져온1을 읽어버리며 000이 된다.

이것이 바로 Overflow.

이렇듯 컴퓨터의 메모리는 한계가 있고, 그 한계를 넘어간 수는 저장할 수 없다.

2000년대로 넘어갈 때 Y2K로 일어났던 해프닝도 이 overflow에 근거를 두고 나왔던 얘기고, 최근 보잉 787기의 소프트웨어 결함으로 최초 시동이 켜지고 248일동안 계속 사용됐다면 이 overflow를 일으켜 모든 전력을 차단하는 심각한 결함이 있었다고 한다. 그래서 보잉에서 실제로 248일마다 비행기를 재부팅 했다고.. 바로, 안에 계산되고 있던 정수를 0으로 돌리기 위해(overflow를 막기위해!!)

출처 : [부스트코스] 모두를 위한 컴퓨터 과학 (CS50 2019) (https://www.edwith.org/boostcourse-cs-050)

profile
한 줌의 소금과 같이 되고 싶은 개발자

0개의 댓글