[C 공부] 4강 — C프로그래밍 입문

부동소수점과 문자열

FlyingSquirrel
4 min readOct 24, 2019

이 포스트는 널널한 개발자님(최호성 분)의 “독하게 시작하는 C 프로그래밍” 강의를 보며 남긴 글입니다.
(👉 독하게 시작하는 C 프로그래밍 강의)

C99에서 이전 버전과 제일 달라진 자료형 내용

  • char: 8bits
  • short: 16bits
  • int: 32bits이다.
  • long : 64bits일 때도 있고 32bits일 때도 있다.
  • long long int: 64bits이다. long long int의 존재는 중요하다. 기억하자.

부동소수점

  • 실수를 근사값으로 표기하는 것이 부동소수점이다.
  • 실수를 표현하는 방법에는 float(32bits), double(64bits), long double(128bits)이 있다.
  • float은 단정보라고 한다. (중요★) 유효 자릿수는 소수점 이하 6자리
  • double은 배정도라고 한다. (중요★) 유효 자릿수는 소수점 이하 15자리
  • long double은 특수정도라고 한다. 특수정도는 지원을 안하는 컴파일러가 있기도 한다. 리눅스 계열 컴파일러는 79bits 특수정도 형식으로 인식해서 구현될 때는 80bits로 구현된다. 정확성이 많이 요구되는 곳에서 사용한다.
  • 부동소수점은 근사값 처리 때문에 오차 범위가 있을 수 밖에 없다. 예를 들어 10/3 은 3.3333… 이니까 어느 순간에 끊어야하니까 오차가 생길 수 밖에 없다.
  • 실수를 쓸 때는 float보다는 double형식으로 주로 쓰는 것이 좋다. float는 6자리가 넘어가면 근사값에 의한 표가 팍팍난다. 보통 우리가 숫자를 정수로 쓴다면 1 다음은 2라고 쓰는데(차이가 1), float은 다음 숫자로 넘어가는 차이가 128인 것이다. 오차가 클 수 밖에 없다.
    (근사한 개발자님 왈: “float은 절대 쓰지마세요!”)
float보다는 double을 써야하는 이유
123.0; // 이건 double이다.
123.0F; // 이러면 float이다.
만약에... float을 쓰면 내가 원하는 값으로 정확하게 표기가 안될 수 있다.
printf("%f\n", 123.45F); // 123.449997
printf("%f\n", 123.45); // 123.450000
만약에... 64의 차이가 나는데도 출력되는 값은 2147483648.000000으로 똑같다.
printf("%f\n", 2147483648.0F); // 2147483648.000000;
printf("%f\n", 2147483648.0F - 20); // 2147483648.000000;
printf("%f\n", 2147483648.0F - 40); // 2147483648.000000;
printf("%f\n", 2147483648.0F - 60); // 2147483648.000000;
printf("%f\n", 2147483648.0F - 64); // 2147483648.000000;
printf("%f\n", 2147483648.0F - 65); // 2147483520.000000;
  • 어떤 자료형을 쓸 지는 매우 중요하다는 예시를 아래 기사로 보자. 나이스라는 교육행정정보 시스템을 개발 할 때 동점자의 등수를 가릴 때 소수점 이하 16자리 가려야하는데, 부동소수점 표현은 소수점이하 15자리까지 표현이 가능한데 16자리까지 가려야하기 때문에 16자리 번째 값은 쓰면 안된다. 내신석차 29,000명이 뒤집어졌다. 엄밀하게는 쓰레기값 처리 누락이 아니라 부동소수점 오차에 따른 오류때문이다.
    (👉나이스, 프로그램에 문제… 쓰레기값 처리누락)

문자열

  • 문자열은 사실 문자배열이라는 말이다. 배열은 똑같은 애들이 나열된 것이 배열이다. 문자열의 본질이 배열이라는 사실을 잊지 말자.
  • 배열은 똑같은 게 연속적으로 나열되어 있는 거다. 이질적인게 나열되면 구조체라고 한다. 이 배열을 식별할 때는 나열되어 있는 것들을 한 번에 식별해야할텐데, 이 배열에 붙인 이름이 메모리의 주소가 된다.
  • 배열을 다루는 코드를 짤 때는 메모리 윈도우를 쳐다보는 건 기본이다.
  • 문자열의 끝은 항상 null(‘\0’)이다. 왜 그런지 설명하려면 지금은 어려우니 일단 외우자.

--

--

FlyingSquirrel
FlyingSquirrel

Written by FlyingSquirrel

감성이 말랑말랑한 개발자입니다.

No responses yet