프로그래머라면 가져야할 숫자에 대한 감각 by 김민장

천문학자가 지구와 태양 사이의 거리나 안드로메다 은하까지의 거리를 모를 리는 없을 것이다. 특정 전공 분야에 종사하는 사람이라면 어떤 숫자에 대한 감, 특히 그 크기에 대한 감을 가지는 것은 중요하다. 자기도 모르는 사이에 몸에 배는 것이다.

마찬가지로 프로그래머라면 컴퓨터에서 볼 수 있는 여러 숫자에 대한 감을 가지는 것은 중요하다. 일반인이야 하드디스크가 1 TB라면 감이 안 잡히겠지만, 프로그래머라면 아주 쉽게 어느 정도 용량인지 감을 잡을 수 있을 것이다. 이런 단순한 컴퓨터 스펙에서 볼 수 있는 숫자 말고, 직접 코딩하다가 겪을 수 있는 숫자에 대해 간단히 테스트를 해보자.

 

몸풀기 질문: 16비트 정수가 가질 수 있는 최댓값은?

. . . . . . . . . .

자, 여기서 0.1초도 안 되어 65,535라도 답할 수 있었는가? 아니면, 부호가 있다면 32,767이고, 부호가 없는 정수라면 65,535라고 답했는가? 이견이 있을 수 있지만, 2^16 = 65,536 정도는 머릿속에 있어야 한다고 생각한다.

 

조금 어려운 질문: 부호 없는 32비트 정수가 가질 수 있는 최댓값은?

. . . . . . . . . .

솔직히 말하면 나도 2^32=4,294,967,296을 외우고 있는 것은 아니다. 그러나 2^32 = 대략_42억이라는 것은 외우고 있다. 그래서 부호가 없는 정수라면 42억 정도가 최댓값이고 부호가 있는 정수라면 21억 정도가 최대다. 그러니까 지구 상의 인구를 담으려면 32비트 정수로는 부족하다가 되겠다.

 

변태스러운 질문: 부호 없는 64비트 정수가 가질 수 있는 최댓값은?

. . . . . . . . . .

죄송합니다. 그냥 이건 “2^64 = 아_졸라게_큰_숫자”라고 외우셔도 됩니다... 였지만, 요즘 64비트 운영체제가 일반화됨에 따라 프로그래머도 64비트를 대상으로 코딩할 때가 잦아졌다. 그래서 2^64가 얼마나 큰지 대략 감은 잡을 필요가 있다.

2^64 바이트는 16 엑사(Exa) 바이트이다. 정확하게는 Exbibyte가 되어야겠지만 MB/KB/GB/TB를 쓰는 관례상 그냥 EB라고 쓴다. 16 EB가 어느 정도의 숫자냐면 16 EB = 16*1024 Petabyte = 16*1024*1024 Terabyte가 된다. 요즘 10만 원 하는 1 TB 하드디스크가 1천 6백만 개 있는 것인 셈.

만약 1초에 1,000명이 접속하는 서버에서 각 접속자마다 일련번호를 준다고 하자. 32비트 부호 없는 정수로는 49.7일밖에 버티지를 못한다 (2^32 / (1000*3600*24) = 49.7일). 그 이후로는 오버플로우가 되어 다시 0으로 될 것이다. 그런데 64비트 부호 없는 정수를 쓴다면, 5.8억 년!!!! 동안 아무런 문제가 없다.

아직 정수 128비트 연산에 대한 요구는 드물다. 2년 전, I모 사에서 인턴 할 때, 128비트 정수 연산이 과연 필요한가라는 이야기가 몇몇 연구원에서 나오는 이야기는 들었지만(암호/보안 관련) 아직까지 구현된 것은 없다. 부동소수점 분야는 정밀도가 늘 요구되므로 128비트 부동소수점도 제안되어 있고 라이브러리도 있다.

 

깜짝 퀴즈: 3GHz는 몇 Hz인가요?

. . . . . . . . . .

1 기가가 10의 9승이라는 것은 아마 잘 알고 있으리라 생각한다. 그런데 “10의 9승”은 그렇게 잘 와 닿지 않는다. 그래서 난 1기가를 10억이라고 외운다. 3기가바이트는 대략 30억 개의 바이트를 저장할 수 있다고 생각한다. 3GHz는 그러므로 30억 헤르쯔가 된다. 요즘 빠른 CPU가 3GHz니까 싱글 스레드 기준으로 1초에 최대 30억 개의 명령어를 처리할 수 있다는 이야기이다. 그래서 아무 일도 안 하는 for 루프를 돌린다면 32비트 부호 없는 정수의 최댓값인 42억까지도 2~3초면 다 돌 수 있다는 이야기가 된다 ^_^ (실제로 해보면 대충 이렇게 나온다)

그 옛날 8086 프로세서에서 코딩할 때는 “FOR I = 0 TO 1000” 만 해도 어느 정도 딜레이가 되었는데..


덧글

  • whiterock 2010/07/15 16:05 # 삭제 답글

    전 그냥 차근히 계산을 합니다. ㅎㅎㅎ
    그렇게 자주 요구된 질문이 아니어서 ㅋㅋㅋㅋ
  • RedPain 2010/07/15 16:21 # 답글

    2의 승수는 64승까지 외워줘야 제 맛... 은 농담입니다만 프로그래머라면 16승까지는 다들 외우고 있겠죠. 그런데 2의 16승까지 외우고 있는 다른 직업(또는 전공)이 있을까요? 수학과.. 정도?
  • 뇌광 2010/07/15 16:31 # 삭제

    ... 천문학?
  • 가이우스 2010/07/15 17:10 #

    그래픽 관련도 알지 않을까요 RGB 라던지... 색상 수 관련으로 말이죠..
  • RedPain 2010/07/16 16:15 #

    뇌광 // 천문학에서 2의 승수를 왜 쓸까요? 궁금... ;;

    가이우스 // 흠... 그럴 수도 있겠네요...
  • 가이우스 2010/07/15 17:35 # 답글

    진정한 프로그래머라면 0과 1로써 모든 숫자를 표현해야합니다.(먼산)
  • DJ™ 2010/07/15 19:59 # 삭제 답글

    옛날에 프로그래머 10계명이라는 글이 생각나는군요...

    골수에 세겨둘만한 숫자들이 몇 되죠... 음...
  • 언젠가는 2010/07/15 22:32 # 삭제 답글

    아스키 코드도 외울만하죠.. '0' 48, 'A' 65, 'a' 97 이정도?
    2^64 18446744073709551616 외우고 있습니다ㅎ
  • 김민장 2010/07/21 13:04 #

    대... 단하십니다! 저는 3.141592654, 2.71828184까지만 외우네요..
  • ipad 2010/07/15 23:05 # 삭제 답글

    저는 2HD 2.5인치 디스켓의 용량이 1,458,667byte라는 것밖에는; 이것도 기억이 가물
  • 가짜집시 2010/07/16 12:19 # 답글

    예전에 보니 어디 비밀 번호가 524288 이더군요. 이유인즉슨 2^19 이기 때문...

    아스키 코드를 외워두면 편한 사람은 48=0x30, 65=0x41, 97=0x61, 100=0x64, 200=0xc8 같은 것도 추가로 외워놓으면 좋습니다 ^^

    프로그래머가 큰 숫자를 다뤄야 하는 경우중 상당 수가 시간을 초로 표현하는 경우에 등장하는데, 하루는 86400초, 1년은 31536000초 - 대략 30*1024*1024 약간 넘어감 - 로 기억해두면 좋더군요. 32bit signed integer로 초 단위까지 표현 가능한 시간의 최대 길이는 68년 정도로, 평균 수명보다는 좀 짧네요
  • DJ™ 2010/07/17 13:01 # 삭제

    200이 무려 'C8' 이로군요......
  • novrain 2010/07/16 15:55 # 답글

    1,2,4,8,16,32,64,128,256,512,1024 (2^0 ~ 2^10),
    2^10 = 1MB, 2^20 = 1GB, 2^30 = 1TB 까지는 알아두면 편리하죠.
  • lyn 2010/07/21 02:48 # 삭제 답글

    Unsigned Integer로 시간을 ms 단위까지 나타내면 대충 42일정도 `-`
  • Ciel 2010/07/21 05:45 # 삭제 답글

    으윽...대학에서 시험칠때는 달달 외웠는데
    지금보니 가물가물하네요.
    좀더 정신 차려야할듯..
  • erinjslee 2010/07/29 09:52 # 삭제 답글

    외고 있기는 한데...... 일부러 외웠다기보다는 그냥 반복적으로 필요한 숫자이기 때문인지....
    그냥 외워진 것 같습니다.
  • 갑수 2010/08/05 14:11 # 삭제 답글

    프로그래머라면 위의 내용뿐만 아니라 삼각함수나 좌표변환같은 기하학과 내적/외적/쿼터니안 등은 기본적으로 알아야죠. 모르면 개발자 아니잖아요, 그냥 노동자지...
  • 2010/08/05 18:21 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 김민장 2010/08/06 04:00 #

    오 안녕.. 요즘 뭐하고 지내냐??? 나도 그럭저럭 살고 있다 ㅎㅎ 전화 번호라도 알려줘~
  • 2010/08/09 13:46 # 삭제 답글 비공개

    비공개 덧글입니다.
  • seso 2011/04/26 12:44 # 삭제 답글

    이런 숫자 이외에도 2진수 16진수 변환 빠르게 하는것도 많이 필요하던데 ㅎㅎㅎ 특히 임베디드할때 ㅎㅎ
  • 다주겄삼 2017/01/06 15:43 # 삭제 답글

    이런거 외우고 좋아하는거 보니...

    아직 대학생이서나, 애긴가 보네...
댓글 입력 영역