function [clnrelresult,z]=clnrel(z);
clnrelresult=[];
persistent firstCall rho sqeps x ; if isempty(firstCall),firstCall=1;end;
;
if isempty(rho), rho=0; end;
if isempty(sqeps), sqeps=0; end;
if isempty(x), x=0; end;
%***BEGIN PROLOGUE CLNREL
%***PURPOSE Evaluate ln(1+X) accurate in the sense of relative error.
%***LIBRARY SLATEC (FNLIB)
%***CATEGORY C4B
%***TYPE COMPLEX (ALNREL-S, DLNREL-D, CLNREL-C)
%***KEYWORDS ELEMENTARY FUNCTIONS, FNLIB, LOGARITHM
%***AUTHOR Fullerton, W., (LANL)
%***DESCRIPTION
%
% CLNREL(Z) = LOG(1+Z) with relative error accuracy near Z = 0.
% Let RHO = ABS(Z) and
% R**2 = ABS(1+Z)**2 = (1+X)**2 + Y**2 = 1 + 2*X + RHO**2 .
% Now if RHO is small we may evaluate CLNREL(Z) accurately by
% LOG(1+Z) = CMPLX (LOG(R), CARG(1+Z))
% = CMPLX (0.5*LOG(R**2), CARG(1+Z))
% = CMPLX (0.5*ALNREL(2*X+RHO**2), CARG(1+Z))
%
%***REFERENCES (NONE)
%***ROUTINES CALLED ALNREL, CARG, R1MACH, XERMSG
%***REVISION HISTORY (YYMMDD)
% 770401 DATE WRITTEN
% 890531 Changed all specific intrinsics to generic. (WRB)
% 890531 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)
%***end PROLOGUE CLNREL
if firstCall, sqeps=[0.0]; end;
firstCall=0;
%***FIRST EXECUTABLE STATEMENT CLNREL
if( sqeps==0. )
sqeps = sqrt(r1mach(4));
end;
%
if( abs(1.+z)<sqeps )
xermsg('SLATEC','CLNREL','ANSWER LT HALF PRECISION BECAUSE Z TOO NEAR -1',1,1);
end;
%
rho = abs(z);
if( rho>0.375 )
clnrelresult = log(1.0+z);
end;
if( rho>0.375 )
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',z); evalin('caller',[inputname(1),'=FUntemp;']); end
return;
end;
%
x = real(z);
clnrelresult = complex(0.5.*alnrel(2..*x+rho.^2),carg(1.0+z));
%
csnil=dbstack(1); csnil=csnil(1).name(1)~='@';
if csnil&&~isempty(inputname(1)), assignin('caller','FUntemp',z); evalin('caller',[inputname(1),'=FUntemp;']); end
end
%DECK CLOG10