티스토리 뷰

컴퓨터에는 메모리라는 것이 있다. 우리가 연산하고 저장하는 것들은 메모리라는 유한한 공간 내에서 이뤄진다. 즉, 하드웨어는 유한하므로 한계를 가진다. 예시로는 아래와 같은 것들이 있다.

부동소수점의 부정확성

부동소수점이란, 실수를 컴퓨터 상에서 근사치로 표현할 때 소수점의 위치를 고정하지 않고 위치를 나타내는 수를 따로 적는 것을 의미한다.

#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);
}

위 처럼 실수 x, y를 받아서 나누어주는 간단한 코드가 있다고 할 때 x에 1을 넣고 y에 10을 넣어준다면 0.1000000 ... 이 나올 것으로 기대한다. 하지만 실제 결과는 x/y = 0.10000000149011611938476562500000000000000000000000 이렇게 나온다.

이 값은 컴퓨터가 계산할 수 있는 값 중 1/10에 가장 가까운 값이다. float 라는 타입에 저장할 수 있는 비트 수(32비트)가 유한하기 때문이다.

정수 오버플로우

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

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

이렇게 무한 루프를 돌면서 2씩 곱해서 출력하는 함수를 짜면, 숫자가 출력되다가 어느 순간 에러 메시지가 뜨고 그 다음부터는 계속 0만 출력된다.

이는 int 역시 4바이트이므로 저장할 수 있는 공간에 한계가 있기 때문이다. 십진수를 가정했을 때, 우리가 쓸 수 있는 자리가 딱 2자리 뿐이라고 생각해보자. 99에다가 1을 더하면 원래는 100이 되어야 하는데, 두자리 밖에 표현하지 못하므로 앞에 1을 잃어버리고 00만 남게 된다. 이런 원리로 위 예시에서도 저장할 수 있는 비트 수를 초과해버렸기 때문에 0만 계속 출력되는 것이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함