function [x,dz]=mpcmd(x,dz);
persistent db dz2 i tm ;
if isempty(i), i=0; end;
global mpcom_4; if isempty(mpcom_4), mpcom_4=0; end;
global mpcom_3; if isempty(mpcom_3), mpcom_3=0; end;
global mpcom_5; if isempty(mpcom_5), mpcom_5=0; end;
%***BEGIN PROLOGUE MPCMD
%***SUBSIDIARY
%***PURPOSE Subsidiary to DQDOTA and DQDOTI
%***LIBRARY SLATEC
%***TYPE ALL (MPCMD-A)
%***AUTHOR (UNKNOWN)
%***DESCRIPTION
%
% Converts multiple-precision X to double-precision DZ. Assumes
% X is in allowable range for double-precision numbers. There is
% some loss of accuracy if the exponent is large.
%
% The argument X(*) is INTEGER array of size 30. See the comments in
% the routine MPBLAS for the reason for this choice.
%
%***SEE ALSO DQDOTA, DQDOTI, MPBLAS
%***ROUTINES CALLED MPCHK, MPERR
%***COMMON BLOCKS MPCOM
%***REVISION HISTORY (YYMMDD)
% 791001 DATE WRITTEN
% ?????? Modified for use with BLAS. Blank COMMON changed to named
% COMMON. R given dimension 12.
% 890531 Changed all specific intrinsics to generic. (WRB)
% 891214 Prologue converted to Version 4.0 format. (BAB)
% 900402 Added TYPE section. (WRB)
% 930124 Increased Array size in MPCON for SUN -r8. (RWC)
%***end PROLOGUE MPCMD
if isempty(db), db=0; end;
if isempty(dz2), dz2=0; end;
% common :: ;
global mpcom_1; if isempty(mpcom_1), mpcom_1=0; end;
global mpcom_2; if isempty(mpcom_2), mpcom_2=0; end;
global mpcom_6; if isempty(mpcom_6), mpcom_6=zeros(1,30); end;
%% common /mpcom / b , t , m , lun , mxr , r(30);
%% common /mpcom / mpcom_1 , mpcom_2 , mpcom_3 , mpcom_4 , mpcom_5 , mpcom_6(30);
x_shape=size(x);x=reshape(x,1,[]);
if isempty(tm), tm=0; end;
%***FIRST EXECUTABLE STATEMENT MPCMD
mpchk(1,4);
dz = 0d0;
if( x(1)==0 )
x_shape=zeros(x_shape);x_shape(:)=x(1:numel(x_shape));x=x_shape;
return;
end;
db = (mpcom_1);
for i = 1 : mpcom_2;
dz = db.*dz + (x(i+2));
tm = fix(i);
% CHECK IF FULL DOUBLE-PRECISION ACCURACY ATTAINED
dz2 = dz + 1d0;
% TEST BELOW NOT ALWAYS EQUIVALENT TO - IF (DZ2.LE.DZ) GO TO 20,
% FOR EXAMPLE ON CYBER 76.
if((dz2-dz)<=0d0 )
break;
end;
end;
% NOW ALLOW FOR EXPONENT
dz = dz.*(db.^(x(2)-tm));
% CHECK REASONABLENESS OF RESULT.
if( dz>0d0 )
% LHS SHOULD BE .LE. 0.5 BUT ALLOW FOR SOME ERROR IN LOG
if( abs((x(2))-(log(dz)./log((mpcom_1))+0.5d0))<=0.6d0 )
if( x(1)<0 )
dz = -dz;
end;
x_shape=zeros(x_shape);x_shape(:)=x(1:numel(x_shape));x=x_shape;
return;
end;
end;
% FOLLOWING MESSAGE INDICATES THAT X IS TOO LARGE OR SMALL -
% TRY USING MPCMDE INSTEAD.
writef(mpcom_4,[' *** FLOATING-POINT OVER/UNDER-FLOW IN MPCMD ***' ' \n']);
%format (' *** FLOATING-POINT OVER/UNDER-FLOW IN MPCMD ***');
mperr;
x_shape=zeros(x_shape);x_shape(:)=x(1:numel(x_shape));x=x_shape;
end
%DECK MPDIVI