모두를 위한 컴퓨터 과학 CS50 데이비드 J. 말란 (David J. Malan)

C언어로 1 나누기 10을 했을 때, 소수점 값은?

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

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

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

 

C 언어의 float를 활용해 x를 y로 나눠보자

 

 

x: 1
y: 10
x / y =0.100000

 

우리가 알고 있듯 값은 0.1이다

뒤에 있는 0000... 들은 필요가 없으므로 깔끔하게 보이게 하려면

 

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

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

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

 

f 앞에. 1을 입력해 주면 된다

 

x: 1
y: 10
x / y =0.1

 

그럼 이렇게 깔끔하게 출력된다

 

그런데 말입니다, 소수점을 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);
}

 

. 50으로 코드를 수정했다

결과는?!

 

x: 1
y: 10
x / y =0.10000000149011611938476562500000000000000000000000

 

으잉? 50자리까지는 출력되는데 중간 숫자가 이상하다

왜 그럴까?

 

float에서 저장가능한 비트의 수가 32비트로 유한하기 때문이다

( double 은 64비트를 사용한다.

고로, double을 사용하면 좀 더 정확하게 계산할 수 있다 )

 

컴퓨터의 저장 공간(메모리)에는 한계가 있고 특정 지점 뒤에는 한계에 부딪혀

결국 저장할 수 있는 값들 중 1 / 10에 가까운 값을 저장하게 된다

 

정수 오버플로우

비슷한 오류로, 1부터 시작해 2를 계속해서 곱하는 코드를 실행했을 때

 

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

int main(void)
{
    for (int i = 1; ; i *= 2)
    {
        printf("%i\n", i);
        sleep(1);
    }
}
...
1073741824
overflow.c:6:25: runtime error: signed integer overflow: 1073741824 * 2 cannot be represented in type 'int'
-2147483648
0
0
...

 

int 타입이 저장할 수 있는 32비트의 크기를 넘은 이후에는 더 이상 넘어갈 1의 자리가 없기 때문에

그 이상의 숫자를 저장하지 못하고 에러와 함께 0이 출력된다

 

실생활에서 발견되었던 오버플로우 문제는 Y2K, 보잉 787 사례가 있다

1999년에 큰 이슈가 되었던 Y2K 문제는 연도를 마지막 두 자리수로 저장했던 관습 때문에 새해가 오면 ‘99’에서 ‘00’으로 정수 오버플로우가 발생하고, 새해가 2000년이 아닌 1900년으로 인식된다는 문제였습니다.
그리고 세계는 수백만 달러를 투자해서 프로그래머들에게 더 많은 메모리를 활용해서 이를 해결하도록 하였습니다.
이는 통찰력 부족으로 발생한 아주 현실적이고 값비싼 문제였습니다.
또한 다른 사례로 비행기 보잉 787에서 구동 후 248일이 지나면 모든 전력을 잃는 문제가 있었습니다.
왜냐하면 강제로 안전 모드로 진입하였기 때문입니다.
이는 소프트웨어의 변수가 248일이 지난 뒤에 오버플로우가되어 발생하였기 때문이었습니다.
248일을 1/100초로 계산하면 대략 2의 32제곱이 나옵니다.
보잉을 설계할때 사용한 변수보다 너무 커졌던 것입니다.
이를 해결하기 위해 주기적으로 재가동을 하여 변수를 다시 0으로 리셋했습니다. 

 

따라서 다루고자 하는 데이터 값의 범위를 유의하며 프로그램을 작성하는 것이 중요하다

 

비전공자와 전공자의 차이정말 단순하게 따져보자면 전공한 수업이 다르다는 것

그렇다면 비전공자들도 전부는 아니더라도 똑같이 대학교 강의를 수강하면 되는것 아닌가?

찾아보고 내가 공부할 사이트들만 찝어왔다 (전부 무료)

 

부스트코스

네이버 커넥트재단에서 기획하고 운영하는 사이트이다

 

모두를 위한 컴퓨터 과학 (CS50 2019)

https://www.boostcourse.org/cs112

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

하버드대학의 최고 인기강좌, 데이비드 말란 교수님의 CS50입니다.
프로그래밍을 처음 공부하는 비전공자 분들도 쉽고 재미있게 학습하실 수 있습니다.-출처: 강의 상세 페이지

여기서 내가 수강할 강의는 무려 하버드대 강의이다

1강 들어본 바로는 정말 재밌고 현장감이 느껴지며 말이 무척 빠르시다

부스트코스 사이트에서 영상 하단에 강의 내용도 잘 정리 해줘 공부하기 좋은 것 같다

 

KOCW (Korea OpenCourseWare)

대학 공개 강의 서비스이다

고등교육 교수학습자료 공동활용 체제, KOCW(Korea OpenCourseWare)

KOCW는 국내.외 대학 및 기관에서 자발적으로 공개한 강의 동영상, 강의자료를 무료로 제공하는 서비스로, 대학생, 교수자는 물론 배움을 필요로 하는 누구든지 언제 어디서나 이용 가능합니다.-출처: KOCW 소개 페이지

여기서 소프트웨어 교육은 하위 링크에 있다

http://www.kocw.net/home/special/themeCourses.do#subject/04

 

KOCW - 테마

이전 다음

www.kocw.net

카테고리가 다양하니 골라 들으면 된다

 

K-MOOC (Massive, Open, Online, Course)

무크(MOOC)란 Massive, Open, Online, Course의 줄임말로 오픈형 온라인 학습 과정을 뜻합니다.
이 것은 강의실에 수용된 학생만이 강의를 들을 수 있었던 것에서 청강만 가능한 온라인 학습동영상으로 변화하고
현재는 질의응답, 토론, 퀴즈, 과제 제출 등 양방향 학습을 할 수 있는 모습으로 완성되었습니다.

이 사이트를 추천하는 블로그는 많은데, 솔직히 강의의 종류가 많지 않아서 가장 아쉬운 사이트이다

공학, 컴퓨터.통신, 이공계 기초과학 카테고리는 하위 링크이다

http://www.kmooc.kr/courses#

 

분야별 강좌 | K-MOOC

 

www.kmooc.kr

취지는 좋으나 강의가 많지 않음 (오른쪽에서 갯수 확인 가능)

+ Recent posts