우선 위키피디아에서 소개하는 MPFR의 설명을 보자

GNU MPFR (for GNU Multiple Precision Floating-Point Reliably[1]) is a portable C library for arbitrary-precision binary floating-point computation with correct rounding, based on GNU Multi-Precision Library.

 

  또 다음은 MPFR 홈페이지에서 소개하는 MPFR의 의미이다.

The main goal of MPFR is to provide a library for multiple-precision floating-point computation which is both efficient and has a well-defined semantics. It copies the good ideas from the ANSI/IEEE-754 standard for double-precision floating-point arithmetic (53-bit significand).

 

GMP는 자리수가 긴 정수 계산을 하기 위한 라이브러리이지만, MPFR은 (IEEE-754의 한계를 넘어) 소소점 이하의 자리수를 원하는 만큼 충분히 확보하여 (유효숫자의 길이가 매우 긴) 소수점수를 계산하기 위한 라이브러리이다.


MPFR을 설치하자면 먼저 GMP가 설치되어 있어야 한다. MPFR의 현재 안정 버전은 3.1,0(2011년 10월 3일 출시)이다. MPFR을 설치하기 위해 GMP 4.1.0 이상이면 되지만, 가급적 GMP 4.2.3 이상을 추천한다. 

MPFR 소스의 압축파일을 내려받아서 압축 해제하고, 그 해제된 디렉로리로 가서

       $ ./configure --prefix=설치될경로 --with-gmp=이미설치된GMP리이브러리의경로

       (예: ./configure --prefix=/usr/local --with-gmp=/usr/local )

       (다른 예: ./configure --prefix=/usr/local --with-gmp-lib=/usr/local/lib --with-gmp-include=/usr/local/include )

       $ make 

       $ make check

       $ sudo make install

의 순서로 설치한다.


다음 소스 코드는 MPFR의 설치 테스트를 하기 위한 간단한 예제(오일러의 초월수 e를 계산하는 예제)이다.

C 언어에서 MPFR 라이브러리를 사용하기 위해서는 헤더 파일 gmp.h와 mpfr.h를 인클루드한다.
컴파일할 때는 반드시 컴파일 옵션 -lmpfr(또는 -lmpfr -lgmp)를 주어야 한다.
또 컴파일 옵션 -o testMPFR 을 준 것은 생성될 실행파일명을 testMPFR로 하라는 의미이다.
이 옵션을 생략하면 생성되는 실행파일명이 a.out(단, cygwin의 경우에는 a.exe)이다.

mpfr_set_d 함수는 mpfr_t 타입의 소수점수에 double 타입의 부동소수점수를 대입하는 함수이고,
mpfr_mul_ui 함수는 mpfr_t 타입의 소수점수에 unsigned long 타입의 정수를 곱하여 대입하는 함수이고,
mpfr_add 함수는 mpfr_t 타입의 소수점수에 mpfr_t 타입의 소수점수를 합아려 대입하는 함수이고,
mpfr_div 함수는 mpfr_t 타입의 소수점수에 mpfr_t 타입의 소수점수를 나누어 대입하는 함수이다.

mpfr_init2 함수는 mpfr_t 타입의 소수점수 변수를 초기화 하는 함수이다. (초기화된 값은 0.0)

       mpfr_init2(t, 200);

또 mpfr_out_str 함수는 첫번째 인수에 지정된 출력장치에 주어진 ASCIZ 문자열을 두번째 인수에 주어진 적당한 진법(이 예에서는 10)을 적용하여 네번째 인수에 주어진 mpfr_t 타입의 소수점수(이 예에서는 s)를 출력하는 함수이다.


  1. // Filename: testMPFR.c
  2. //
  3. //     See: http://www.mpfr.org/sample.html
  4. //
  5. // Compile: gcc -o testMPFR testMPFR.c -lmpfr
  6. //      Or: gcc -o testMPFR testMPFR.c -lmpfr -lgmp
  7. // ExecuteL ./testMPFR
  8. #include <stdio.h>
  9. #include <gmp.h>
  10. #include <mpfr.h>
  11. int main (void)
  12. {
  13.   unsigned int i;
  14.   mpfr_t s, t, u;
  15.   mpfr_init2 (t, 200);
  16.   mpfr_set_d (t, 1.0, GMP_RNDD);
  17.   mpfr_init2 (s, 200);
  18.   mpfr_set_d (s, 1.0, GMP_RNDD);
  19.   mpfr_init2 (u, 200);
  20.   for (i = 1; i <= 100; i++)
  21.     {
  22.       mpfr_mul_ui (t, t, i, GMP_RNDU);
  23.       mpfr_set_d (u, 1.0, GMP_RNDD);
  24.       mpfr_div (u, u, t, GMP_RNDD);
  25.       mpfr_add (s, s, u, GMP_RNDD);
  26.     }
  27.   printf ("Sum is ");
  28.   mpfr_out_str (stdout, 10, 0, s, GMP_RNDD);
  29.   putchar ('\n');
  30.   mpfr_clear (s);
  31.   mpfr_clear (t);
  32.   mpfr_clear (u);
  33.   return 0;
  34. }
  35. /*
  36. Output:
  37. Sum is 2.7182818284590452353602874713526624977572470936999595749669131
  38. */


컴파일> gcc -o testMPFR testMPFR.c -lmpfr -lgmp

실행> ./testMPFR
2.7182818284590452353602874713526624977572470936999595749669131




Posted by Scripter
,