프로그래밍/C 44

long long 타입의 정수를 printf 함수로 출력하기

우선 다음 소스는 컴파일하는데는 아무 문제가 없지만 실행 결과는 전혀 엉뚱하다. printf 함수에 사용된 %lld 포맷에 문제가 있기 때문이다. /* * Filename: testLongLong0.c * * Compile: gcc -o testLongLong0 testLongLong0.c * or * Compile: cl testLongLong0.c */ #include int main() { printf("Maximum long long value is %40lld\n", 9223372036854775807LL); printf("Maximum long long value is %40llu\n", 9223372036854775807ULL); printf("Maximum long long value is..

프로그래밍/C 2013.12.03

C 언어에서 동작하는 쓰레기 수집기(Garbage collector)

C 언어 프로그래밍에서 까다로운 부분 중의 하나는 획득했던(할당받았던) 메모리를 여하히 해제하느냐이다. 프로그램밍의 사소한 오류로 메모리 부족 현상이 쉽게 일어나기 때문이다. 자바 언어, 파이썬 언어, C# 언어 등은 자동으로 쓰레기 수집(garbage collection)이 이루어지므로 거의 신경쓰지 않아도 되지만, C 언어는 소스 작성하는 프로그래머가 직접해야 한다. 오래 전(10여년 전)에 Hans Boehm 가 만들었던 C/C++ 언어용 쓰레기 수집기(Boehm-Demers-Weiser conservative garbage collector, 줄여사 BoehmGC 러고 부름)를 이용하여 컴파일되고 실행되는 소스이다. 이 쓰레기 수집기를 쓰면, 메모리 해제(free)를 프로그래머가 신경쓰지 않아도 ..

프로그래밍/C 2013.10.19

이진 파일을 읽어서 16진수로 보여주는 HexView 소스 with C

C 언어 소스: // Filename: testHexView_02.c // // Chapter 1. Section 1. // // A basic pattern of C++ Programing // // Compile: gcc -o testHexView_02 testHexView_02.c #include #include #include #include void toHex(char c, char a[3]); void toHex8(int n, char a[10]); int main(int argc, char *argv[]) { char *fname; FILE *file2; fpos_t fsize; long m; int i; char x; char s[3]; char t[10]; char buf[16]; fpo..

프로그래밍/C 2013.08.05

Visual C 2010 으로 컴파일하여 실행해 본 OpenGL 예제: Redbook 의 Teapots

Visual C 용으로 OpenGL 용 소스를 작성할 떼는 헤더 파일 gl.h 와 glu.h 는 사용하지 않아도 된다. glut.h 하나만 사용하면 된다. 컴파일할 때는 헤더 파일을 위한 경로나 라이브러리 파일을 위한 경로를 별도로 지정하지 않아도 된다. 즉, 명령 cl 소스파일명 으로 소스파일이 컴파일되어 실행파일이 생성된다. 아래 예제는 OpenGL Redebook 에 소개되어 있는 cube 예제 소스이다. /* * Copyright (c) 1993-1997, Silicon Graphics, Inc. * ALL RIGHTS RESERVED * Permission to use, copy, modify, and distribute this software for * any purpose and witho..

프로그래밍/C 2013.05.17

Visual C 2010 으로 컴파일하여 실행해 본 OpenGL 예제: Redbook 의 Cube

Visual C 용으로 OpenGL 용 소스를 작성할 떼는 헤더 파일 gl.h 와 glu.h 는 사용하지 않아도 된다. glut.h 하나만 사용하면 된다. 컴파일할 때는 헤더 파일을 위한 경로나 라이브러리 파일을 위한 경로를 별도로 지정하지 않아도 된다. 즉, 명령 cl 소스파일명 으로 소스파일이 컴파일되어 실행파일이 생성된다. 아래 예제는 OpenGL Redebook 에 소개되어 있는 cube 예제 소스이다. // Filename: cube.c // // See: http://www.glprogramming.com/red/chapter03.html // #include // Commented out for Visual C // #include // Commented out for Visual C #in..

프로그래밍/C 2013.05.10

gcc 와 g++ 의 log 계산 오류

양의 정수를 이진법으로 표현할 때 자리수를 구하는 C 언어 함수를 두 가지로 구현해 보았다. 함수 int nbits(int) 는 주어진 정수를 직접 2로 나누기를 반복하면서 자리수를 구한 것이고, 함수 int bits(int) 는 밑이 2인 로그함수 lg(x) = log(x)/log(2) 를 이용하여 구한 것이다. 그런데 Cygwin 또는 Linux 에서 gcc 로 컴파일하여 실행하면 오루가 빌생한다. (참고로 gcc 의 버전은 4.5.3 이다.) MinGW 의 gcc 는 버전이 4.6.2 인데 마찬가지로 log 계산에 오류가 있다. Visual C, C#, Java, Python 으로는 2100000000 이하의 양의 정수에 대하여 그런 오류가 발생하지 않는다. // Filename: calcLG64...

프로그래밍/C 2013.02.25

부정확한 부동소수점수 계산에 대하여

C 언어로 배정밀도 부동소수점수(floating point number of double type)로 높은 차수의 다항식 값을 계산을 하는 경우의 오차에 대하여 생각해보기로 하자. 우선 0.7 을 (배정밀도이든 단정밀도이든 상관없이) 부동소수점수로 정확하게 기억시키는 방법은 없다. 0.7 을 배정밀도 부동소수점수(double 타입의 수)로 처리하여 십진법수로 표현하면 유효숫자가 겨우 14개 내지 15개 정도 밖에 되지 않는다. 수 1 에 비하여 오차 1.0e-15 는 상대적으로 매우 작은 오차이다. 그러나 차수가 매우 높은 다항식 함수는 아주 짧은 구간(간격이 약 1.0e-15 인 구간) 안에서도 매우 많은 진동을 하여 함수값의 차이는 매우 커질 수가 있으니 주의해야 한다. 식 f(x) = 2*x*x -..

프로그래밍/C 2013.01.22

(C 언어로 구현해 보는) 십진법의 신비: 숫자 계산 피라미드 세 가지

C 언어로 작성된 다음 소스를 컴파일하여 실행하면 숫자 계산으로 쌓아 올린 피라미드 세 가지가 출력된다. (gcc 는 GNU C 컴파일러의 컴파일 명령이고, cl 은 Visual C++ 컴파일러의 컴파일 명령이다.) 세 함수 pyra1(int, int), pyra2(int, int), pyra3(int, int) 은 재귀호출을 사용하였고, 세 함수 pyramid1(), pyramid2(), pyramid3() 은 for 반복문을 사용하였다. // Filename: pyramidOfDigits2.c // // Compile: gcc -o pyramidOfDigits2 pyramidOfDigits2.c // Execute: ./pyramidOfDigits2 // // Or // // Compile: cl p..

프로그래밍/C 2013.01.22

C 언어로 평방근, 입방근, n제곱근 구하는 함수를 구현하고 테스트하기

음이 아닌 실수 A 의 평방근 sqrt(A) 를 구하는 Heron 의 방법: 반복함수 g(x) = (x + A/x) / 2 를 이용 실수 A 의 n제곱근 root(n, A) 를 구하는 Newton-Raphson 의 방법 반복함수 g(x) = ((n-1)*x + A/(x**(n - 1))) / n 를 이용 n = 2 인 경우에는 Newton-Raphson 의 방법이 Heron 의 방법과 동일하다. (참조. http://en.wikipedia.org/wiki/Newton's_method ) (math.h 를 인클루드하여 사용하는) C 언어의 표준 수학 라이브러리에 지수 계산 함수 pow() 가 이미 구현되어 있다. 하지만 차후 필요한 데가 있을 것 같아서 이와 유사한 n 제곱 함수와 n 제곱근 함수를 구현해..

프로그래밍/C 2013.01.12