프로그래밍/C 44

C 언어에서 큰 부동소수점수(native double) 의 정확도

정수부의 자리수가 조금 큰 부동소수점수(64비트 double 포맷의 수)를 십진수 표현으로 출력해 보았습니다. 십진수로 표현하면 유효자리수 개수가 약 14~15개 정도인데, Java 언어와 C# 언어에서는 유효수자를 적당한개수(17개나 15개)로 자르고 그 뒤를 모두 0으로 출력하였지만, C 언어에서는 유효수자 아래 부분을 자르지 않고 모두 출력합니다. Pyhon 언어에서도 C 언어 처럼 유효수자 아래 부분을 0으로 채우지 않습니다. 물론 Java, C#, Python, C, C++ 어느 프로그램 언어든 십진수로 표현할 때 자르는 방법이나 유효수자 아래 부분을 채우는 방법은 다르지만, 덧셈, 뺄셈, 곱셈, 나누셈, 기타 등등에서 유효수자 아래부분의 처리 결과는 대동소이합니다. C 언어에서 긴 자리 정수를..

프로그래밍/C 2023.03.19

MSYS2 에서 C 언어의 printf(...) 가 제대로 출력하지 못할 때...

아래의 단순한 코드로 작성되어 gcc 로 컴파일된 실행파일의 콘솔 출력이 비정상인 경우.... #include int main(void) { int i; for (i = 0; i < 5; i++) { printf("abcd %d\r\n",i); Sleep(1000); } return 0; } 첫째 해결 방법: 아래의 수정된 코드 처럼 모든 printf.(...); 구문 뒤에 fflush(strout); 를 추가한다. #include int main(void) { int i; for (i = 0; i < 5; i++) { printf("abcd %d\r\n",i); fflush(stdout); // 모든 printf(...); 구문 뒤에 이를 추가한다. Sleep(1000); } return 0; } 둘째..

프로그래밍/C 2022.01.08

Lanczos 계수를 이용하여 Gamma 함수값 구하기

아래의 소스는 Coefficients for the Lanczos Approximation to the Gamma Function 의 것을 Microsoft Visual C/C++ 명령줄 컴파일러 cl 로 컴파일되도록 수정한 것이다. // Filename: test_gamma_lanczos.c // // Compile: cl test_gamma_lanczos.c /EHsc /utf-8 // Execute: test_gamma_lanczos #include #define _USE_MATH_DEFINES // for C #include #define LG_g 5.0 // Lanczos parameter "g" #define LG_N 6 // Range of coefficients i=[0..N] const ..

프로그래밍/C 2021.12.08

MPFR 라이브러리를 이용하여 Gamma 함수값 계산하기

Visual Studio 2019 와 MSYS2 MinGW64 에서 테스트 된 소스입니다. 혹시 MinGW 에서 컴파일되지 않으면 $ packman -S mpfr 명령으로 mpfr 라이브러리를 설치하고 컴파일하면 된다. // Filename: calcGammaFn.c // // Compile: gcc -o calcGammaFn calcGammaFn.c -lmpfr -lgmp // Execute: ./calcGammaFn // Or // Compile: cl calcGammaFn.c /I. mpfr.lib // Execute: calcGammaFn // // Date: 2021.01.28 #include #include // for log(10) #include int main() { mpfr_t x; i..

프로그래밍/C 2021.01.28

cygwin 의 gcc 로 UTF-8 한글 처리하는 간단한 예제

Cygwin 에서는 printf 와 wprint 를 동시에 사용하는 경우, 컴파일은 성공하지만 실행하면 wprintf 가 제대로 동작하지 않는다. 그리고 wprint 나 swptinf 사용 시 스트링을 출력하기 위해서는 %s 대신 %ls 포맷을 사용해야 한다. Cygwin 의 경우 wchar_t 의 크기는 2바이트이다. #include #include #include #include int main(int argc, const char *argv[]) { wchar_t wt[100]; /// setlocale(LC_ALL,"kr_KR.UTF-8"); setlocale(LC_ALL,""); // printf("sizeof(wchar_t) = %d\n", sizeof(wchar_t)); // printf("..

프로그래밍/C 2014.04.13

cygwin/mingw 의 gcc 로 utf-8 한글 처리하기

우선 다음은 ms949 인코딩으로 저장한 C 소스이다. * 소스 파일명: hello.c #include #include int main() { printf("Hello, 안녕하세요?\n"); printf("strlen(\"Hello, 안녕하세요?\\n\") = %d\n", strlen("Hello, 안녕하세요?\n")); return 0; } * 컴파일 > gcc -o hello hello.c * 실행 > hello Hello, 안녕하세요? strlen("Hello, 안녕하세요?\n") = 19 다음은 utf-8 인코딩으로 저장한 C 소스이다. * 소스 파일명: hello2.c #include #include #include #include #define wstrlen wcslen int main() {..

프로그래밍/C 2014.04.02

Visual C++ 2010 과 pdcurses 를 이용한 helloworld 예제

pdcurses 를 컴파일하여 Visual C++ 용 라이브러리 만들기 프롬프트> nmake -f vcwin32.mak * 테스트용 소스 파일: helloworld.c (http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/helloworld.html 에 있는 ncurses 용 소스에서 인클루드 문의 ncurses.h 를 curses.h 로 변경한 것 뿐임) /* * Filename: helloworld.c * * Compile: cl /c helloworld.c /I . * Link: link -nologo helloworld.obj pdcurses.lib user32.lib gdi32.lib advapi32.lib shell32.lib comdlg32.lib * Or ..

프로그래밍/C 2014.01.15

gcc 와 ncurses 를 이용한 카라슈바 곱셈 연습기

ncurses(또는 curses) 는 Linux/Unix 계열의 환경에서 VT100 등의 터미널과 호환되는 윈도우형 입출력 라이브러이다. 이를 이용하면 윈도우의 임의의 위치에 출력도 하고, 임의의 위치에서 입력을 받을 수도 있다. * 카라슈바 곱셈 참조 다음은 Linux 나 Cygwin 환경이면 gcc 로 컴파일하여 실행되는 C 소스이다. /* * Filename: ezmult_003.c * * Compile: gcc -o ezmult_003 ezmult_003.c -lform -lncurses * * Execute: ./ezmult_003 * * Date: 2014. 1. 6. (Mon) v0.002 * Date: 2014. 1. 8. (Wed) v0.003 */ #include #include #in..

프로그래밍/C 2014.01.08

64bit 리눅스에서 32bit 용 C 소스 컴파일하기

32bit OS 에서는 int 타입과 long 타입이 다 같이 4바이트의 크기를 갖지만. 64bit OS 에서는 int 타입이 4바이트, long 타입이 8바이트의 크기를 갖는다. 그렇다면 64비트 리눅스 환경에서 32비트 용으로 작성된 C 소스를 gcc 로 컴파일하려면 어떻게 해야 할까? // Filename: testIntSize.c int main() { #include int main() { printf("sizeof(int) = %d\n", sizeof(int)); printf("sizeof(long) = %d\n", sizeof(long)); return 0; } # 64비트 용으로 컴파일하고 실행하기 $ gcc -o testIntSize testIntSize.c $ ./testIntSize ..

프로그래밍/C 2014.01.04

오일러(Euler) phi 함수 구현하기

Visual C++ 2010 으로 컴파일할 경우, 헤더파일 inttypes.h 가 Visual C++ 2010 에는 빠져 있으므로 http://msinttypes.googlecode.com/svn/trunk/inttypes.h 를 가져와서 아래의 소스와 동일한 디렉토리에 두고 컴파일한다. char * 타입의 C 스트링으로 부터 long long 타입의 정수로 파싱하려면 C99 에서 정한 함수 strtoll 함수를 쓰면 되는데 이 함수 역시 Visual C++ 2010 에는 빠져 있으므로, _strtoi64 함수로 대체하기 위해 소스의 앞 부분에 매크로 정의 #define strtoll _strtoi64 를 추가하였다. 또 main 함수 안에서 사용된 llabs 함수는 long long 타입의 정수의 절댓..

프로그래밍/C 2013.12.14