RosettaCodeData/Task/Gamma-function/Stata/gamma-function.stata
2018-06-22 20:57:24 +00:00

42 lines
1 KiB
Text

mata
_gamma_coef = 1.0,
5.7721566490153286061e-1,-6.5587807152025388108e-1,
-4.2002635034095235529e-2,1.665386113822914895e-1,
-4.2197734555544336748e-2,-9.6219715278769735621e-3,
7.2189432466630995424e-3,-1.1651675918590651121e-3,
-2.1524167411495097282e-4,1.2805028238811618615e-4,
-2.0134854780788238656e-5,-1.2504934821426706573e-6,
1.1330272319816958824e-6,-2.0563384169776071035e-7,
6.1160951044814158179e-9,5.0020076444692229301e-9,
-1.1812745704870201446e-9,1.0434267116911005105e-10,
7.782263439905071254e-12,-3.6968056186422057082e-12,
5.100370287454475979e-13,-2.0583260535665067832e-14,
-5.3481225394230179824e-15
function gamma_(x_) {
external _gamma_coef
x = x_
for (y=1; x>2;) y = --x*y
z = _gamma_coef[24]
x--
for (i=23; i>=1; i--) z = z*x+_gamma_coef[i]
return(y/z)
}
function map(f,a) {
n = rows(a)
p = cols(a)
b = J(n,p,.)
for (i=1; i<=n; i++) {
for (j=1; j<=p; j++) {
b[i,j] = (*f)(a[i,j])
}
}
return(b)
}
x=(1::10000)/100
u=map(&gamma(),x)
v=map(&gamma_(),x)
max(abs((u-v):/u))
end