프로그래밍/C
MPFR 라이브러리를 이용하여 Gamma 함수값 계산하기
Scripter
2021. 1. 28. 23:22
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 <stdio.h>
#include <math.h> // for log(10)
#include <mpfr.h>
int main()
{
mpfr_t x;
int i, inex;
mpfr_set_emin (-41);
mpfr_init2 (x, 42);
for (i = 1; i <= 17; i++)
{
mpfr_set_ui (x, i, MPFR_RNDN);
inex = mpfr_gamma (x, x, MPFR_RNDZ);
mpfr_subnormalize (x, inex, MPFR_RNDZ);
mpfr_dump (x);
}
printf("\n");
for (i = 1; i <= 17; i++)
{
mpfr_set_ui (x, i, MPFR_RNDN);
inex = mpfr_gamma (x, x, MPFR_RNDZ);
mpfr_printf("Gamma(%2d) = %2d! = %Rf\n", i, i - 1, x);
}
printf("\n");
for (i = 1; i <= 17; i++)
{
mpfr_set_ui (x, i, MPFR_RNDN);
inex = mpfr_lngamma (x, x, MPFR_RNDZ);
mpfr_printf("LogGamma(%2d) = Log(%2d!) = %Rf\n", i, i - 1, x);
}
printf("\n");
double t10 = log(10.0);
printf("log(10) = %f\n", t10);
printf("\n");
for (i = 1; i <= 17; i++)
{
mpfr_set_ui (x, i, MPFR_RNDN);
inex = mpfr_lngamma (x, x, MPFR_RNDZ);
inex = mpfr_div_d(x, x, t10, MPFR_RNDZ);
mpfr_printf("Log10Gamma(%2d) = Log10(%2d!) = %Rf\n", i, i - 1, x);
}
mpfr_clear (x);
return 0;
}
/*
Output:
LogGamma( 1) = Log( 0!) = 0
LogGamma( 2) = Log( 1!) = 0
LogGamma( 3) = Log( 2!) = 0.693147
LogGamma( 4) = Log( 3!) = 1.791759
LogGamma( 5) = Log( 4!) = 3.178054
LogGamma( 6) = Log( 5!) = 4.787492
LogGamma( 7) = Log( 6!) = 6.579251
LogGamma( 8) = Log( 7!) = 8.525161
LogGamma( 9) = Log( 8!) = 10.604603
LogGamma(10) = Log( 9!) = 12.801827
LogGamma(11) = Log(10!) = 15.104413
LogGamma(12) = Log(11!) = 17.502308
LogGamma(13) = Log(12!) = 19.987214
LogGamma(14) = Log(13!) = 22.552164
LogGamma(15) = Log(14!) = 25.191221
LogGamma(16) = Log(15!) = 27.899271
LogGamma(17) = Log(16!) = 30.671860
log(10) = 2.302585
Log10Gamma( 1) = Log10( 0!) = 0
Log10Gamma( 2) = Log10( 1!) = 0
Log10Gamma( 3) = Log10( 2!) = 0.301030
Log10Gamma( 4) = Log10( 3!) = 0.778151
Log10Gamma( 5) = Log10( 4!) = 1.380211
Log10Gamma( 6) = Log10( 5!) = 2.079181
Log10Gamma( 7) = Log10( 6!) = 2.857332
Log10Gamma( 8) = Log10( 7!) = 3.702431
Log10Gamma( 9) = Log10( 8!) = 4.605521
Log10Gamma(10) = Log10( 9!) = 5.559763
Log10Gamma(11) = Log10(10!) = 6.559763
Log10Gamma(12) = Log10(11!) = 7.601156
Log10Gamma(13) = Log10(12!) = 8.680337
Log10Gamma(14) = Log10(13!) = 9.794280
Log10Gamma(15) = Log10(14!) = 10.940408
Log10Gamma(16) = Log10(15!) = 12.116500
Log10Gamma(17) = Log10(16!) = 13.320620
*/