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 <gmpxx.h> 구문으로

c++ 언어를 사용하기 위함이다.

./configure --enable-cxx

이제 make 명령으로 빌드한다.]

$ make

설치 전에 빌드한 것을 체크한다.

make check

빌드된 것을 /usr/local 폴더에 설치한다.

이 풀더에는 관리자 권한으로 쓰기 작업해야 하므로 sudo 명령이 필요하다.

(사용자의 개인 폴더에 설치할 때는 sudo 명령이 없어도 된다.)

$ sudo make install

설치 과정 중에 파생된 잡다한 파일들을 제거한다.


make clean

c++ 용 에제 소스를 작성하고 more 명령으로 확인한다.

more test-gmp.cc
#include <iostream>
#include <gmpxx.h>

using namespace std;

int main (void)
{
  mpz_class a, b, c;

  a = 1234;
  b = "-5678";
  c = a+b;
  cout << "sum is " << c << "\n";
  cout << "absolute value is " << abs(c) << "\n";

  return 0;
}


작성된 위의 소스를 g++ 명령으로 컴파일한다.


g++ -o test-gmp test-gmp.cc -lgmpxx -lgmp

 

컴파일 하여 생성된 파일을 실행한다.


./test-gmp
sum is -4444
absolute value is 4444

 

 

 

Posted by Scripter

댓글을 달아 주세요

 

아래의 단순한 코드로 작성되어 gcc 로 컴파일된 실행파일의 콘솔 출력이 비정상인 경우....

 

#include <stdio.h>

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 <stdio.h>

int main(void)
{
    int i;

    for (i = 0; i < 5; i++)
    {
        printf("abcd %d\r\n",i);
        fflush(stdout);     // 모든 printf(...); 구문 뒤에 이를 추가한다.
        
        Sleep(1000);
    }
    return 0;
}

 

둘째 해결 방법:

    아래의 수정된 코드 처럼 모든 main() 함수에서

     printf(...);  구문이 시작되기 전에 setvbuf(...);  구문을 한 번만 추가한다.

#include <stdio.h>

int main(void)
{
    int i;

    setvbuf(stdout, (char *)NULL, _IOLBF,0 );

    for (i = 0; i < 5; i++)
    {
        printf("abcd %d\r\n",i);
        Sleep(1000);
    }
    return 0;
}

 

※ 윈도우의 MSYS2 에서 flex & bison 으로 작성된 어플의 printf() 출력이 제대로 안 될 때는

  위의 두 가지 방법 모두 안 되니, 다른 방법으로 해결해여 한다.

 

 

 

Posted by Scripter

댓글을 달아 주세요

지난 2021년 12월 6일(약 열흘 전)에 Python 3.10.1 이 출시되었다.

 

설치하자 마자 인터프리터 쉫로 간단히 테스트해 보았다.

 

Python 3.10.1 (tags/v3.10.1:2cd268a, Dec  6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello~")
Hello~
>>> for i in range(11):
...     print(2**i)
...
1
2
4
8
16
32
64
128
256
512
1024
>>> import math
>>> math.factorial(10)
3628800
>>> math.gamma(11)
3628800.0
>>> math.lgamma(11)
15.104412573075514
>>> math.log(math.gamma(11))
15.104412573075516
>>> math.exp(10)
22026.465794806718
>>> 10**10
10000000000
>>> 10.0**10.0
10000000000.0
>>> math.pow(10.0, 10.0)
10000000000.0
>>> math.exp(10.0*math.log(10.0))
10000000000.00004
>>> math.sqrt(10)
3.1622776601683795
>>> math.cbrt(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'math' has no attribute 'cbrt'
>>> math.tan(1)
1.5574077246549023
>>> math.atan(1)
0.7853981633974483
>>> 4*(math.atan(1.0/5)*4 - math.atan(1.0/239))
3.1415926535897936
>>> math.pi
3.141592653589793
>>> math.e
2.718281828459045
>>> math.exp(1)
2.718281828459045
>>> (math.exp(1) - math.exp(-1))/2
1.1752011936438014             ^
SyntaxError: unmatched ')'
>>> math.sinh(1)
1.1752011936438014
>>> math.atan(1)
0.7853981633974483
>>> math.gcd(625, 1000)
125
>>> quit()

 

아직 세제곱근(cube root) 구하는 math.cbrt(float) 함수는 구현되지 않았다.

 

-----------------------------------------------------------------------------

Union 타입 생성  연산자 '|' 기 Python 3.10.x 에 추가되었다.


>>> # Union 타입을 매개변수로 방아 Union 타입을 리턴허눈 험수
>>> # def f(list: list[Union[int, str]], param: Optional[int]) -> Union[float, str]

>>>  # 대신, 다음 구문으로 가능

>>> def f(list: list[int | str], param: int | None) -> float | str:
.>>> ..     pass
...


>> int 타입과 list[int] 타입의 Union 타입

>>> str(int | list[str])
'int | list[str]'



>>> 두 int 타입의 Union 타입
>>> str(int | int)
"<class 'int'>"


>>> Union 타입을 이용헌 인스턴스 확인

>>> isinstance("", int | str)
True


>>> Union 타입을 이용헌 상속 확인

>>> issubclass(bool, int | float)
True

 

>>> # 클래스 상속과 Union 타입 생성 연산자 확인
>>> class M(type):
...         def __or__(self, other): return "Hello"
...
>>> class C(metaclass=M): pass
...

>>> C | int
'Hello'


>>> int | C
int | __main__.C

 

-------------------------------------------------

다음은 아직은 아니지만 다음 릴리즈에 추가될 것 중의 하나이다.

우선 다음 내용을 test,py 라는 파일명으로 자장하고,

x = {'a':{'b':{'c':None}}}
x['a']['b']['c']['d'] = 1

 

프롬프트> python test,py

명령으로 실행합니다. 그러면 다음 에러 메시지가 나온다.

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    x['a']['b']['c']['d'] = 1
TypeError: 'NoneType' object does not support item assignment

 

이 에러 메시지 만으로는 시퀀스 타입 자료에 어느 것이 None 인지 알 수가 없다.

다음 릴리즈에서는 에러 메시지가

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    x['a']['b']['c']['d'] = 1
    ~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

로 출력된다. (이는 핸재 Python Pre-Release 3.11.0a3 에서 확인되옸다.)

 

 

 

 

 

 

Posted by Scripter

댓글을 달아 주세요