프로그래밍 605

분수 계산 라이브러리 FractionLib 를 소개합니다.

먼저 파이썬 인터프리터를 실행하여 0.3 - 0.2 - 0.1 의 계산 결과를 알아 보았습니다. >>> 0.3 - 0.2 - 0.1 -2.7755575615628914e-17 계산 결과가 왜 0이 아닌 엉뚱한 값 -2.7755575615628914e-17 이 될까요? IEEE754 에 대해서는 관련되는 두 문서 [1] Double-precision floating-point format [2] Floating Point Arithmetic: Issues and Limitations 를 참고하기 바랍니다. NET Framework 4.6.x 이상에서 사용가능한 NET용 분수 계산 라이브러리를 소개합니다. (소스 수정 없이 NET Core 5.0 이상에서도 사용 가능합니다.) (Mac OS 에서도 Fract..

프로그래밍/C# 2022.07.25

맥 OS X에 gmplib 6.2.1 설치하고 g++로 설치 테스트하기

gmplib 의 현재 최신 릴리즈는 2020년 11월 14일에 출시된 gmplib 6.2.1 이다. 우선 이곳에서 압축 파일을 하나 다운로드한다. 여기서는 gmp-6.2.1.tar.xz 을 다운로드한 것으로 간주하고 설치 과정을 소개한다. 우선 tar 명령으로 다운로드한 파일의 압축을 해제한다. (아래에서 $ 는 쉘 프롬프트이므로 입력하지 않아먀 한다.) $ tar Jxvf gmp-6.2.1.tar.gz 위 명령에 의하여 현제 폴더에 gmp-6.2.1 이라는 폴더가 생기면서 압축된 것들이 이 폴더 아래에 해제된다. 이제 cd 명령으로 그 하위 폴더로 이동한다. $ cd gmp-6.2.1 configure 명령으로 설치하기 전 설정을 한다. 여기서 옵션 --enable-cxx 는 #include 구문으로 ..

프로그래밍/C++ 2022.03.19

0.3 - 0.2 - 0.1 != 0.0

0.3 - 0.2 - 0.1 == 0.0 0.3 - 0.2 - 0.1 != 0.0 0.3 - 0.2 - 0.1 -eq 0.0 0.3 - 0.2 - 0.1 -ne 0.0 PowerShell 뿐만 아니라 배정말도 부동소수점수(IEEE754-1987 포맷) 계산에서는 십진수로 유효수자(sifnificant digits) 개수가 약 15개 밖에 안되므로 모든 소수점수를 근사값으로 계산한다. (mantissa 가 52bit, 부호가 1bit, 지수부가 11bit 로 총 64bit 즉, 8byte) Byte 7 Byte 6 Byte 5 Byte 4 Byte 3 Byte 2 Byte 1 Byte 0 Byte 0 -------- -------- -------- -------- -------- -------- -----..

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

Boost Library를 이용하여 임의의 정밀도를 갖는 부동소수점수 계산하기

Boost Library 1.75.0 을 설치하고 Visual Studio 2019 의 명령행 컴파일러 cl 로 컴파일하였다. 컴파일하기 전에 미리 환경변수 BOOST_LIB_PATH 와 MPIR_LIB_PATH 를 각각 Boost Library 와 MPIR Library 가 있는 경로로 설정해 놓아야 한다. /* * Filename: CalculateAreaOfDiskWithBoosLibrary.cpp * * Purpose: Test floating point numbers of arbitrary precision. * * Compile: cl CalculateAreaOfDiskWithBoosLibrary.cpp /I%BOOST_LIB_PATH% /I%MPIR_LIB_PATH% /EHsc /utf-8 ..

프로그래밍/C++ 2021.03.29

new 키워드로 생성된 배열의 크기 변경하여 재할당하기

C 언어로 동적 메모리(dynamic memory)를 할당빋으려면 malloc() 함수나 calloc() 함수를 사용하고, 해제할 때는 free() 함수를 사용한다. C++ 언에서도 이를 사용해도 되지만 메모리 할당과 관리를 객체의 생성과 소멸 과정 중에 혹은 함수의 호출과 리턴의 과정 중에 프로그래머가 일일이 간섭하려면 귀찮기도 하고, 잠간의 실수로, 심각한 버그가 발생하여 치명적인 결함이 생길 수도 있다. C++ 언어에서는 배열의 메모리 할당과 해제를 C 언어 보다 좀 더 안전하고 편하게 해 주는 new 타입[] 과 delete[] 포인터변수 형태의 구문이 있다. 예를 들어, 부동소수점수 double 타입의 값을 10개 저장하는 공간을 할당받고 해제하는 구문의 예는 다음과 같다. double *my_..

프로그래밍/C++ 2021.02.24

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

utf8 인코딩을 이용한 다국어 hello world

C 언어 또는 C++ 언어에서는 문자열 인코딩을 처리할려면 무척 애을 먹는다. 반면에 Java 언어나 Python 언어에서는 문자열 인코딩 문제가 일치 감치 해결되어 있으므로 조금만 주의하면 별 어려움이 없다. 우선 간단한 Python 소스를 보자. # -- coding: utf=8 -*- greetings = [ "Hello~", # English "안녕하세요?", # Korean "んにちは。", # Japanese "您好!" # Chinesse ] for msg in greetings: print(msg) """ Output: Hello~ 안녕하세요? んにちは。 您好! """ 위의 소스를 저장할 때 utf8 인코딩으로 저장하면 실행 시에 터미널 환경의 문자셋 여부에 상관없이 정상적으로 잘 출력된다, ..

프로그래밍/C++ 2021.01.23

C++ 에서 C 함수를 불러 사용하기

일반적으로 C 언어로 작성된 함수를 C++ 언어에서 불러 사용하려면 extern "C" 라는 키워드가 필요하다. C 언어의 함수 정의를 ****.h 라는 헤더 파일에 기록해 두고 이 헤더 파일응 C++ 소스에서 포함(include)하려면 몇 가지 주의할 점이 있다. 우선 함수의 정의가 있는 C 소스와 C 언어용 헤더 파일을 보자. [(구현) 파일명: sayHello.c] ------------------------------------ #include void print_message(char *message) { printf("%s\n", message); } 위는 print_message(char *) 라는 함수 하나만 달랑 구현되어 있는 C 소스 파일이다. [(정의) 파일명: sayHello.h] ..

프로그래밍/C++ 2021.01.07