프로그래밍/C++ 57

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

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

프로그래밍/C++ 2023.03.19

부동소수점수의 소수점 아래에 홑 따옴표 문자 ' 붙여서 가독성 높이기

부동소수점수에 '를 붙이면 가독성이 좋아 실수를 덜 합니다. 아래의 소스는 MSVC 와 g++ 로 잘 컴파일되고 동일한 실행 결과를 얻습니다. // Filename: test_cpp_literal.cpp // // Compile: cl /utf-8 /EHsc test_cpp_literal.cpp // Execute: test_cpp_literal // // Or // // Compile: g++ -o test_cpp_literal test_cpp_literal.cpp // Execute:./test_cpp_literal // // Output: // pie = // 3.14159 // 3.14159 // 3.141593 // 3.141593e+00 // // pie = // 3.141593 // 3.14..

프로그래밍/C++ 2023.01.03

맥 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

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

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

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

Cygwin 에서는 printf 와 wprint 를 동시에 사용하는 경우, 컴파일은 성공하지만 실행하면 wprintf 가 제대로 동작하지 않는다. 그리고 wprint 나 swptinf 사용 시 스트링을 출력하기 위해서는 %s 대신 %ls 포맷을 사용해야 한다. Cygwin 의 경우 wchar_t 의 크기는 2바이트이다. C++ 언어에서는 스트링(문자열) 클래스인 string 이 준비되어 있지만, utf-8 스트링을 db위해서는 wstring 을 써야 한다. 또 표준 입출력 cin 과 cout 대신 wcin 과 wcout 을 써야 허며 이를 위해서는 헤더 파일 iostream 을 인클루드(포함)해야 하고 이름 공간 std 를 써야 한다. 또 C 언어 처럼 setlocale(LC_ALL,""); 도 해야 한..

프로그래밍/C++ 2014.04.13

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

다음은 utf-8 인코딩으로 저장한 C++ 소스이다. Cygwin의 g++ tkdyd tl, 만일 아래의 소스에서 std::setlocale(LC_ALL, "ko_KR.UTF-8"); 대신 std::locale::global (std::locale ("ko_KR.UTF-8")); 로 하면 캄핑ㄹ은 되지만 실행 시에 Segmentation fault (core dumped) 에러가 난다. * 소스 파일명: testLocale_003.cpp // Filename: testLocale_003.cpp // // Compile: g++ -std=c++11 -o testLocale_003 testLocale_003.cpp // or g++ -std=c++0x -o testLocale_003 testLocale_00..

프로그래밍/C++ 2014.04.10