Code covered by the BSD License  

Highlights from
slatec

from slatec by Ben Barrowes
The slatec library converted into matlab functions.

[dgammaresult,x]=dgamma(x);
function [dgammaresult,x]=dgamma(x);
dgammaresult=[];
persistent dxrel first firstCall gamcs i n ngam pi sinpiy sq2pil xmax xmin y ; if isempty(firstCall),firstCall=1;end; 

;
if isempty(i), i=0; end;
if isempty(n), n=0; end;
if isempty(ngam), ngam=0; end;
%***BEGIN PROLOGUE  DGAMMA
%***PURPOSE  Compute the complete Gamma function.
%***LIBRARY   SLATEC (FNLIB)
%***CATEGORY  C7A
%***TYPE      doubleprecision (GAMMA-S, DGAMMA-D, CGAMMA-C)
%***KEYWORDS  COMPLETE GAMMA FUNCTION, FNLIB, SPECIAL FUNCTIONS
%***AUTHOR  Fullerton, W., (LANL)
%***DESCRIPTION
%
% DGAMMA(X) calculates the doubleprecision complete Gamma function
% for doubleprecision argument X.
%
% Series for GAM        on the interval  0.          to  1.00000E+00
%                                        with weighted error   5.79E-32
%                                         log weighted error  31.24
%                               significant figures required  30.00
%                                    decimal places required  32.05
%
%***REFERENCES  (NONE)
%***ROUTINES CALLED  D1MACH, D9LGMC, DCSEVL, DGAMLM, INITDS, XERMSG
%***REVISION HISTORY  (YYMMDD)
%   770601  DATE WRITTEN
%   890531  Changed all specific intrinsics to generic.  (WRB)
%   890911  Removed unnecessary intrinsics.  (WRB)
%   890911  REVISION DATE from Version 3.2
%   891214  Prologue converted to Version 4.0 format.  (BAB)
%   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
%   920618  Removed space from variable name.  (RWC, WRB)
%***end PROLOGUE  DGAMMA
if isempty(gamcs), gamcs=zeros(1,42); end;
if isempty(dxrel), dxrel=0; end;
if isempty(pi), pi=0; end;
if isempty(sinpiy), sinpiy=0; end;
if isempty(sq2pil), sq2pil=0; end;
if isempty(xmax), xmax=0; end;
if isempty(xmin), xmin=0; end;
if isempty(y), y=0; end;
if isempty(first), first=false; end;
%
if firstCall,   gamcs(1)=[+.8571195590989331421920062399942d-2];  end;
if firstCall,   gamcs(2)=[+.4415381324841006757191315771652d-2];  end;
if firstCall,   gamcs(3)=[+.5685043681599363378632664588789d-1];  end;
if firstCall,   gamcs(4)=[-.4219835396418560501012500186624d-2];  end;
if firstCall,   gamcs(5)=[+.1326808181212460220584006796352d-2];  end;
if firstCall,   gamcs(6)=[-.1893024529798880432523947023886d-3];  end;
if firstCall,   gamcs(7)=[+.3606925327441245256578082217225d-4];  end;
if firstCall,   gamcs(8)=[-.6056761904460864218485548290365d-5];  end;
if firstCall,   gamcs(9)=[+.1055829546302283344731823509093d-5];  end;
if firstCall,   gamcs(10)=[-.1811967365542384048291855891166d-6];  end;
if firstCall,   gamcs(11)=[+.3117724964715322277790254593169d-7];  end;
if firstCall,   gamcs(12)=[-.5354219639019687140874081024347d-8];  end;
if firstCall,   gamcs(13)=[+.9193275519859588946887786825940d-9];  end;
if firstCall,   gamcs(14)=[-.1577941280288339761767423273953d-9];  end;
if firstCall,   gamcs(15)=[+.2707980622934954543266540433089d-10];  end;
if firstCall,   gamcs(16)=[-.4646818653825730144081661058933d-11];  end;
if firstCall,   gamcs(17)=[+.7973350192007419656460767175359d-12];  end;
if firstCall,   gamcs(18)=[-.1368078209830916025799499172309d-12];  end;
if firstCall,   gamcs(19)=[+.2347319486563800657233471771688d-13];  end;
if firstCall,   gamcs(20)=[-.4027432614949066932766570534699d-14];  end;
if firstCall,   gamcs(21)=[+.6910051747372100912138336975257d-15];  end;
if firstCall,   gamcs(22)=[-.1185584500221992907052387126192d-15];  end;
if firstCall,   gamcs(23)=[+.2034148542496373955201026051932d-16];  end;
if firstCall,   gamcs(24)=[-.3490054341717405849274012949108d-17];  end;
if firstCall,   gamcs(25)=[+.5987993856485305567135051066026d-18];  end;
if firstCall,   gamcs(26)=[-.1027378057872228074490069778431d-18];  end;
if firstCall,   gamcs(27)=[+.1762702816060529824942759660748d-19];  end;
if firstCall,   gamcs(28)=[-.3024320653735306260958772112042d-20];  end;
if firstCall,   gamcs(29)=[+.5188914660218397839717833550506d-21];  end;
if firstCall,   gamcs(30)=[-.8902770842456576692449251601066d-22];  end;
if firstCall,   gamcs(31)=[+.1527474068493342602274596891306d-22];  end;
if firstCall,   gamcs(32)=[-.2620731256187362900257328332799d-23];  end;
if firstCall,   gamcs(33)=[+.4496464047830538670331046570666d-24];  end;
if firstCall,   gamcs(34)=[-.7714712731336877911703901525333d-25];  end;
if firstCall,   gamcs(35)=[+.1323635453126044036486572714666d-25];  end;
if firstCall,   gamcs(36)=[-.2270999412942928816702313813333d-26];  end;
if firstCall,   gamcs(37)=[+.3896418998003991449320816639999d-27];  end;
if firstCall,   gamcs(38)=[-.6685198115125953327792127999999d-28];  end;
if firstCall,   gamcs(39)=[+.1146998663140024384347613866666d-28];  end;
if firstCall,   gamcs(40)=[-.1967938586345134677295103999999d-29];  end;
if firstCall,   gamcs(41)=[+.3376448816585338090334890666666d-30];  end;
if firstCall,   gamcs(42)=[-.5793070335782135784625493333333d-31];  end;
if firstCall,   pi=[3.14159265358979323846264338327950d0];  end;
if firstCall,   sq2pil=[0.91893853320467274178032973640562d0];  end;
if firstCall,   first=[true];  end;
firstCall=0;
%***FIRST EXECUTABLE STATEMENT  DGAMMA
if( first )
[ngam ,gamcs]=initds(gamcs,42,0.1.*real(d1mach(3)));
%
[xmin,xmax]=dgamlm(xmin,xmax);
dxrel = sqrt(d1mach(4));
end;
first = false;
%
y = abs(x);
if( y>10.0d0 )
%
% GAMMA(X) FOR ABS(X) .GT. 10.0.  RECALL Y = ABS(X).
%
if( x>xmax )
xermsg('SLATEC','DGAMMA','X SO BIG GAMMA OVERFLOWS',3,2);
end;
%
dgammaresult = 0.0d0;
if( x<xmin )
xermsg('SLATEC','DGAMMA','X SO SMALL GAMMA UNDERFLOWS',2,1);
end;
if( x<xmin )
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',x); evalin('caller',[inputname(1),'=FUntemp;']); end
return;
end;
%
dgammaresult = exp((y-0.5d0).*log(y)-y+sq2pil+d9lgmc(y));
if( x>0.0d0 )
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',x); evalin('caller',[inputname(1),'=FUntemp;']); end
return;
end;
%
if( abs((x-fix(x-0.5D0))./x)<dxrel )
xermsg('SLATEC','DGAMMA','ANSWER LT HALF PRECISION, X TOO NEAR NEGATIVE INTEGER',1,1);
end;
%
sinpiy = sin(pi.*y);
if( sinpiy==0.0D0 )
xermsg('SLATEC','DGAMMA','X IS A NEGATIVE INTEGER',4,2);
end;
%
dgammaresult = -pi./(y.*sinpiy.*dgammaresult);
else;
%
% COMPUTE GAMMA(X) FOR -XBND .LE. X .LE. XBND.  REDUCE INTERVAL AND FIND
% GAMMA(1+Y) FOR 0.0 .LE. Y .LT. 1.0 FIRST OF ALL.
%
n = fix(x);
if( x<0.0d0 )
n = fix(n - 1);
end;
y = x - n;
n = fix(n - 1);
dgammaresult = 0.9375d0 + dcsevl(2.0d0.*y-1.0d0,gamcs,ngam);
if( n==0 )
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',x); evalin('caller',[inputname(1),'=FUntemp;']); end
return;
end;
%
if( n>0 )
%
% GAMMA(X) FOR X .GE. 2.0 AND X .LE. 10.0
%
for i = 1 : n;
dgammaresult =(y+i).*dgammaresult;
end; i = fix(n+1);
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',x); evalin('caller',[inputname(1),'=FUntemp;']); end
return;
else;
%
% COMPUTE GAMMA(X) FOR X .LT. 1.0
%
n = fix(-n);
if( x==0.0D0 )
xermsg('SLATEC','DGAMMA','X IS 0',4,2);
end;
if( x<0.0 && x+n-2==0.0D0 )
xermsg('SLATEC','DGAMMA','X IS A NEGATIVE INTEGER',4,2);
end;
if( x<(-0.5D0) && abs((x-fix(x-0.5D0))./x)<dxrel )
xermsg('SLATEC','DGAMMA','ANSWER LT HALF PRECISION BECAUSE X TOO NEAR NEGATIVE INTEGER',1,1);
end;
%
for i = 1 : n;
dgammaresult = dgammaresult./(x+i-1);
end; i = fix(n+1);
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',x); evalin('caller',[inputname(1),'=FUntemp;']); end
return;
end;
end;
%
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',x); evalin('caller',[inputname(1),'=FUntemp;']); end
end
%DECK DGAMR

Contact us