@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             MFN021
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
~V2 -16
                                                                       ISSUE 6~
~V2 0
~V9 -1
~P
~V9 1
~YMFN021
~S1~M~LMATHEMATICAL LIBRARY IMPLEMENTATION DESCRIPTION
~S1~M~LSection 2 Version 1
~S1~LSection 2.1 Mathematical Functions
~S1~L1. General Description
~BThis section provides machine independent procedures for
double precision (64 bit)
mathematical functions.
~BThe algorithms are set up for floating point numbers with a
base of 2 or 16. To compile the library for base 2 operation,
all lines starting ::BASE2 must be included. This is done by
editing the file before compilation to remove all ::BASE2.
~BSimilarly, to compile the library for base 16 operation all
lines starting ::BASE16 must be included. A pre-compilation edit to
remove all ::BASE16 will achieve this.
~S1~L2. Interfaces~
~
Mathematical Library Procedures:~
~
~LDouble Precision (64 bit)~
   DEXP~
   DLN~
   DSIN~
   DCOS~
   DTAN~
   DASIN~
   DACOS~
   DATAN~
   DSINH~
   DCOSH~
   DTANH~
   DSQRT~
   DRPOWER~
   DIPOWER~
   DLOG~
   DATAN2~
~
Other Modules Used:~
   Section  0:   (Configuration)~
~S1~L2.1 Hardware Interface
~S1~L2.2 Software Interface
~S118) DEXP,DLOG,DSIN,DCOS,DTAN,DASIN,DACOS,DATAN,DSINH,DCOSH,DTANH,~
    DSQRT,DRPOWER,DIPOWER,DLOG,DATAN2~
~BThese Library procedures are the same as the appropriate single
precision procedures of section 1, but are for 64 bit accuracy.
Implementation and derivation of algorithms are as described in
section 1.
~S1~L3. Implementation
~S1~L3.1 Outline of Operation
~S1~L3.2 Data Structures
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                MFN021
~V9 -1
~F
@TITLE MFN02(1,6)
@COL 1S-2F
@FLOW 1-2
@BOX 1.0
DOUBLE PRECISION
MATHMATICAL FUNCTIONS
@BOX 2.0
END
@BOX 1.1
PSPEC FORM.DP($IN,$RE64)/$RE64;
PSPEC DP.EXP($RE64)/$IN;
PSPEC DP.MANT($RE64)/$RE64;
LSPEC ENTER.TRAP($IN,$IN);
IMPORT LITERAL MAX.EXP,MIN.EXP;
MODULE(DEXP,DLN,DSIN,DCOS,DTAN,DASIN,DACOS,DATAN,
        DSINH,DCOSH,DTANH,DSQRT,DRPOWER,DIPOWER,DLOG,
        DATAN2);
LSPEC DEXP ($RE64 )/$RE64;
LSPEC DLN ($RE64 )/$RE64;
LSPEC DSIN ($RE64 )/$RE64;
LSPEC DCOS($RE64)/$RE64;
LSPEC DTAN($RE64)/$RE64;
LSPEC DASIN($RE64)/$RE64;
LSPEC DACOS($RE64)/$RE64;
LSPEC DATAN($RE64)/$RE64;
LSPEC DSINH($RE64)/$RE64;
LSPEC DCOSH($RE64)/$RE64;
LSPEC DTANH($RE64)/$RE64;
LSPEC DSQRT ($RE64 )/$RE64;
LSPEC DRPOWER($RE64,$RE64)/$RE64;
LSPEC DIPOWER($RE64,$IN32)/$RE64;
LSPEC DATAN2 ($RE64 ,$RE64 )/$RE64;
LSPEC DLOG ($RE64 )/$RE64;
LITERAL/$RE32    PIBY2    =    1.570796326794896;
#MFN02.1
#MFN02.2
#MFN02.3
#MFN02.4
#MFN02.5
#MFN02.6
#MFN02.7
#MFN02.8
#MFN02.9
#MFN02.10
#MFN02.11
#MFN02.12
#MFN02.13
#MFN02.14
#MFN02.15
#MFN02.16
@BOX 2.1
*END
@END
@TITLE MFN02.1(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DEXP(X)
@BOX 2.0
CODE FOR DEXP
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DEXP( AA);
$IN I;
::BASE16 LITERAL /$RE64     LOGEBASE   =            -2.772588722239785  ;
::BASE2 LITERAL /$RE64   LOGEBASE   =   -0.693147180559945   ;
LITERAL /$RE64     P0   =             1.000000000000003  ;
LITERAL /$RE64     P1   =            -0.693147180559909  ;
LITERAL /$RE64     P2   =             0.240226506957616  ;
LITERAL /$RE64     P3   =            -0.055504108641562  ;
LITERAL /$RE64     P4   =             0.009618128920594  ;
LITERAL /$RE64     P5   =            -0.001333354936029  ;
LITERAL /$RE64     P6   =             0.000154032725291  ;
LITERAL /$RE64     P7   =            -0.000015247856434  ;
LITERAL /$RE64     P8   =             0.000001315585623  ;
LITERAL /$RE64     P9   =            -0.000000097197400  ;
LITERAL /$RE64     P10   =             0.000000005002211  ;
 IF       AA >= MAX.EXP, -> OVERFL;
 IF       AA =< MIN.EXP, -> UNDERFL;
  AA/LOGEBASE => AA  => I;
IF AA = 0. THEN 1. => DEXP;EXIT FI
 IF   AA < 0. THEN
   1.->I;
 FI ;
 I  -: AA=>AA*P10+P9*AA+P8*AA
 +P7*AA+P6*AA+P5*AA+P4*AA+P3*AA+P2*AA+P1*AA+P0=>AA;
::BASE16 AA*AA=>AA*AA=>AA;
FORM.DP(0.-I,AA) => DEXP;
EXIT;
OVERFL: ENTER.TRAP(8,10);
UNDERFL:  0. => DEXP;
END ;
@END
@TITLE MFN02.2(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DLN(X)
@BOX 2.0
CODE FOR DLN
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DLN ( AA);
$RE64  EXP,CJ,CONST,XX;
IF   AA =< 0., -> OVERFL;
::BASE16 LITERAL /$RE64     LOGEBASE   =             2.772588722239785  ;
::BASE2 LITERAL /$RE64   LOGEBASE   =   0.693147180559945   ;
LITERAL /$RE64     B1   =             0.500000000000000  ;
LITERAL /$RE64     B2   =             0.250000000000000  ;
LITERAL /$RE64     B3   =             0.125000000000000  ;
::BASE16 LITERAL /$RE64     C1   =             0.707106781186547  ;
::BASE2 LITERAL /$RE64   C1   =   0.9170040432046722;
::BASE16 LITERAL /$RE64     C2   =             0.353553390593274  ;
::BASE16 LITERAL /$RE64     C3   =             0.176776695296637  ;
::BASE16 LITERAL /$RE64     C4   =             0.088388347648318  ;
LITERAL /$RE64     P0   =             2.000000000000003  ;
LITERAL /$RE64     P1   =             0.666666666663367  ;
LITERAL /$RE64     P2   =             0.400000001206045  ;
LITERAL /$RE64     P3   =             0.285714091590489  ;
LITERAL /$RE64     P4   =             0.222238233327911  ;
LITERAL /$RE64     P5   =             0.181113626796700  ;
LITERAL /$RE64     P6   =             0.169482124880000  ;
::BASE16 LITERAL /$RE64     CJ1   =            -0.346573590279973  ;
::BASE2 LITERAL /$RE64   CJ1   =   -0.086643397569993   ;
::BASE16 LITERAL /$RE64     CJ2   =            -1.039720770839917  ;
::BASE16 LITERAL /$RE64     CJ3   =            -1.732867951399864  ;
::BASE16 LITERAL /$RE64     CJ4   =            -2.426015131959811  ;
DP.EXP(AA) => EXP;
DP.MANT(AA) => AA;
::BASE16  IF   AA < B2, -> I43;
::BASE16  IF   AA < B1, -> I2;
  CJ1 => CJ;
  C1 => CONST;
 EVAL:
  CONST + AA /:  (AA-CONST) =>AA*AA=>XX*P6+P5*XX+P4*XX+P3*XX+P2*XX
 +P1*XX+P0*AA=>XX;
  LOGEBASE*EXP+CJ+XX=>DLN;
 EXIT ;
::BASE16  I43:   IF   AA < B3, -> I4;
::BASE16   CJ3 => CJ;
::BASE16   C3 => CONST;
::BASE16  -> EVAL;
::BASE16  I4:;
::BASE16   CJ4 => CJ;
::BASE16   C4 => CONST;
::BASE16  -> EVAL;
::BASE16  I2:;
::BASE16   CJ2 => CJ;
::BASE16   C2 => CONST;
::BASE16  -> EVAL;
OVERFL:   ENTER.TRAP(8,10);
END ;
@END
@TITLE MFN02.3(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DSIN(X)
@BOX 2.0
CODE FOR DSIN
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DSIN( AA);
$RE64  XX,YY;
$IN32  I;
LITERAL /$RE64     C1   =             0.636619772367591  ;
LITERAL /$RE64     ONE   =             1.000000000000003  ;
LITERAL /$RE64     P7   =            -0.000000000644621  ;
LITERAL /$RE64     P6   =             0.000000056882033  ;
LITERAL /$RE64     P5   =            -0.000003598809117  ;
LITERAL /$RE64     P4   =             0.000160441168470  ;
LITERAL /$RE64     P3   =            -0.004681754131060  ;
LITERAL /$RE64     P2   =             0.079692626245618  ;
LITERAL /$RE64     P1   =            -0.645964097506219  ;
LITERAL /$RE64     P0   =             1.570796326794894  ;
 AA * C1 => XX  => I;
IF   XX < 0. THEN
   1 -> I;
FI ;
I  -: XX=>YY;
IF  I & %1 = 0, -> L1;
 YY -: ONE => YY;
L1:  YY*YY=>XX*P7+P6*XX+P5*XX+P4*XX+P3*XX+P2*XX+P1*XX+P0*YY=>XX;
IF  I & %2 = 0, -> L2;
 XX -: 0. => DSIN;
EXIT ;
L2:  XX => DSIN;
EXIT ;
END ;
@END
@TITLE MFN02.4(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DCOS(X)
@BOX 2.0
CODE FOR DCOS
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DCOS( AA);
$RE64  XX,YY;
$IN32  I;
LITERAL /$RE64     C1   =             0.636619772367591  ;
LITERAL /$RE64     ONE   =             1.000000000000003  ;
LITERAL /$RE64     P7   =            -0.000000000644621  ;
LITERAL /$RE64     P6   =             0.000000056882033  ;
LITERAL /$RE64     P5   =            -0.000003598809117  ;
LITERAL /$RE64     P4   =             0.000160441168470  ;
LITERAL /$RE64     P3   =            -0.004681754131060  ;
LITERAL /$RE64     P2   =             0.079692626245618  ;
LITERAL /$RE64     P1   =            -0.645964097506219  ;
LITERAL /$RE64     P0   =             1.570796326794894  ;
LITERAL /$RE64     PIBY2   =             1.570796326794894  ;
 AA + PIBY2 * C1 => AA  => I;
IF   AA < 0. THEN
   1 -> I;
FI ;
I  -: AA => YY;
IF  I & 1 /= 0 THEN
    YY -: ONE => YY;
FI ;
 YY*YY => XX*P7+P6*XX+P5*XX+P4*XX+P3*XX+P2
  *XX+P1*XX+P0*YY => YY;
IF  I & 2 = 0 THEN
    YY => DCOS;
   EXIT ;
ELSE ;
    YY -: 0. => DCOS;
   EXIT ;
FI ;
END ;
@END
@TITLE MFN02.5(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DTAN
@BOX 2.0
DTAN = DSIN/DCOS
(NOT VERY EFFICIENT)
@BOX 3.0
END
@BOX 1.1
PROC DTAN(X);
@BOX 2.1
DSIN(X)/DCOS(X) => DTAN :: MAY CAUSE EXPONENT OVERFLOW

@BOX 3.1
END
@END
@TITLE MFN02.6(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DASIN
@BOX 2.0
DASIN = DATAN(X/DSQRT(1-X*X))
@BOX 3.0
END
@BOX 1.1
PROC DASIN(X);
$RE64 Y;
@BOX 2.1
IF X < 0.9999999999 AND X > 0.-0.9999999999 THEN
DSQRT(X*X-:1.) => Y; :: NEEDS SENSIBLE ARGUMENT;
DATAN(X/Y) => DASIN;
ELSE;
X * PIBY2=>DASIN;
FI;
@BOX 3.1
END;
@END
@TITLE MFN02.7(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DACOS
@BOX 2.0
DACOS = PI/2 - DASIN
@BOX 3.0
END
@BOX 1.1
PROC DACOS(X);
@BOX 2.1
DASIN(X) -: PIBY2 => DACOS;
@BOX 3.1
END;
@END
@TITLE MFN02.8(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DATAN(X)
@BOX 2.0
CODE FOR DATAN
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DATAN ( AA);
$RE64  T,ATX,TS,X;
LITERAL /$RE64     XX1   =             0.267949192431123  ;
LITERAL /$RE64     XX2   =             1.000000000000000  ;
LITERAL /$RE64     XX3   =             3.732050818744749  ;
LITERAL /$RE64     X1   =             1.732050807568864  ;
LITERAL /$RE64     X12   =             4.000000000000000  ;
LITERAL /$RE64     X2   =             0.577350269189615  ;
LITERAL /$RE64     X22   =             1.333333333333333  ;
LITERAL /$RE64     P7   =            -0.052086939040000  ;
LITERAL /$RE64     P6   =             0.075307149134800  ;
LITERAL /$RE64     P5   =            -0.090813432247050  ;
LITERAL /$RE64     P4   =             0.111107941840294  ;
LITERAL /$RE64     P3   =            -0.142857085548841  ;
LITERAL /$RE64     P2   =             0.199999999489675  ;
LITERAL /$RE64     P1   =            -0.333333333331600  ;
LITERAL /$RE64     P0   =             1.000000000000000  ;
LITERAL /$RE64     PB6   =             0.523598775598299  ;
LITERAL /$RE64     PB3   =             1.047197551196598  ;
LITERAL /$RE64     PB2   =             1.570796326794897  ;
LITERAL /$RE64     ONE   =             1.000000000000000  ;
IF   AA => X < 0. THEN
   0. -:> X;
FI ;
IF   X > XX2, -> IN34;
IF   X =< XX1, -> ST1;
 X + X1 /: X12 -: X1 => T;
 PB6 => ATX;
->ST;
ST1:    X=> T;
    0. => ATX;
ST:    T*T => TS;
 P7*TS+P6*TS+P5*TS+P4*TS+P3*TS+P2*TS+P1*TS+P0*T+ATX=>X;
IF   AA < 0. THEN
   0. -:> X;
FI ;
 X => DATAN;
EXIT ;
IN34:   IF   X =< XX3, -> IN2;
 X /: ONE -: 0. => T;
 PB2 => ATX;
-> ST;
IN2:    X + X2 /: X22 -: X2 => T;
 PB3 => ATX;
->ST;
END ;
@END
@TITLE MFN02.9(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DSINH
@BOX 2.0
E^X - E^-X/2
(INACCURATE 1X1<1)
@BOX 3.0
END
@BOX 1.1
PROC DSINH(X);
@BOX 2.1
DEXP(X) - DEXP(0.-X)/2. => DSINH;
@BOX 3.1
END;
@END
@TITLE MFN02.10(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DCOSH
@BOX 2.0
E^X + E^-X/2
@BOX 3.0
END
@BOX 1.1
PROC DCOSH(X);
@BOX 2.1
DEXP(X) + DEXP(0.-X) /2. => DCOSH;
@BOX 3.1
END;
@END
@TITLE MFN02.11(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DTANH(X)
@BOX 2.0
CODE FOR DTANH
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DTANH( AA);
$RE64  XX,XSQ;
LITERAL /$RE64     C1   =            18.368410284838496  ;
LITERAL /$RE64     C2   =             0.162870578986080  ;
LITERAL /$RE64     P7   =             0.003592128036572  ;
LITERAL /$RE64     P6   =            -0.001455834387051  ;
LITERAL /$RE64     P5   =            -0.008863235529902  ;
LITERAL /$RE64     P4   =             0.021869488536155  ;
LITERAL /$RE64     P3   =            -0.053968253968254  ;
LITERAL /$RE64     P2   =             0.133333333333333  ;
LITERAL /$RE64     P1   =            -0.333333333333333  ;
LITERAL /$RE64     P0   =             1.000000000000000  ;
LITERAL /$RE64     ONE   =             1.000000000000000  ;
LITERAL /$RE64     TWO   =             2.000000000000000  ;
IF   AA => XX < 0. THEN
   0. -:> XX;
FI ;
IF   XX >= C1,->UNITY;
IF   XX>= C2,->L2;
 XX*XX=>XSQ*P7+P6*XSQ+P5*XSQ+P4*XSQ
+P3*XSQ+P2*XSQ+P1*XSQ+P0*XX=>XX;
EXITE: IF  AA > 0. THEN
 XX => DTANH;
EXIT ;
ELSE ;
 0. - XX => DTANH;
EXIT ;
FI ;
UNITY:  ONE => XX;
->EXITE;
L2:  DEXP(TWO*XX)+ONE /: TWO -: ONE => XX;
->EXITE;
END ;
@END
@TITLE MFN02.12(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DSQRT(X)
@BOX 2.0
CODE FOR DSQRT
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DSQRT( AA);
$RE64  XX,M;
$IN EXP1,EXP2;
 IF   AA < 0., ->FAIL;
 IF   AA = 0., ->DONE;
LITERAL /$RE64     P0   =             5.021278583999997  ;
LITERAL /$RE64     P1   =           -22.334752489999978  ;
LITERAL /$RE64     P2   =            53.224909100000097  ;
LITERAL /$RE64     P3   =           -56.923922359999998  ;
LITERAL /$RE64     P4   =            22.057560799999968  ;
::BASE16 LITERAL /$RE64     RBASE   =             4.000000000000000  ;
::BASE2 LITERAL /$RE64   RBASE   =   1.414213562373094   ;
LITERAL /$RE64     THREE   =             3.000000000000000  ;
LITERAL /$RE64     HALF   =             0.500000000000000  ;
DP.EXP(AA) => EXP1/2 => EXP2;
DP.MANT(AA) => M
  *P4+P3*M+P2*M+P1*M+P0 =>XX*M*XX-:THREE
   *XX*HALF => XX*M*XX -:THREE*XX*HALF=>XX
   *M*XX -:THREE*XX*HALF=>XX*M*XX
   -:THREE*XX*HALF => XX
*M*XX -:THREE*XX*HALF => XX
*M*XX -:THREE*XX*HALF => XX
*M*XX-:THREE*XX*HALF=> XX
*M*XX-:THREE*XX*HALF*M => XX;
FORM.DP(EXP2,XX) => XX;
IF  EXP1 & %1 = 0 ,-> L1;
IF EXP1 > 0 THEN
 XX*RBASE => DSQRT;
ELSE
   XX/RBASE => DSQRT;
FI
EXIT ;
L1:  XX => DSQRT;
EXIT ;
FAILDONE:;
IF   AA/=0.,->FAIL;
DONE:  0. => DSQRT;
EXIT ;
FAIL: ENTER.TRAP(8,11);
END ;
@END
@TITLE MFN02.13(1,6)
@COL 1A-2S-3T-4R-5N-6F
@COL 7T-8R-9N
@COL 10R
@ROW 4-7
@ROW 8-10
@ROW 5-9
@FLOW 2-3NO-4-5-6
@FLOW 3YES-7NO-8-9-5
@FLOW 7YES-10-9
@BOX 1.0
DRPOWER
@BOX 2.0
DRPOWER (P1,P2)
@BOX 3.0
P1 = 0?
@BOX 4.0
RESULT =
DEXP (P2*DLN(P1))
@BOX 5.0
@BOX 6.0
EXIT
@BOX 7.0
P2 = 0?
@BOX 8.0
RESULT = 0
@BOX 9.0
@BOX 10.0
@BOX 1.1
@BOX 2.1
PROC DRPOWER( P1, P2);
@BOX 3.1
IF   P1=0.,
@BOX 4.1
 DEXP(DLN(P1)*P2)=>DRPOWER;
@BOX 6.1
EXIT
END
@BOX 7.1
IF   P2=0.,
@BOX 8.1
0.=>DRPOWER;
@BOX 10.1
ENTER.TRAP(8,12);
@END
@TITLE MFN02.14(1,6)
@COL 8A
@COL 1S-2T-3R-5R
@COL 9T-10R-11C-14T-18T-15R-16F
@COL 17R
@ROW 3-9
@ROW 15-17
@FLOW 1-2NO-3-5-14-18NO-15-16
@FLOW 14YES-16
@FLOW 2YES-9NO-10-11
@FLOW 9YES-17-16
@FLOW 18YES-17
@BOX 1.0
DIPOWER(R,I)
@BOX 2.0
I=0?
@BOX 3.0
NEGATE I IF NEGATIVE
@BOX 5.0
CALC R**I=>R
@BOX 8.0
DIPOWER
@BOX 9.0
R=0?
@BOX 10.0
RESULT=1
@BOX 11.0
EXIT
@BOX 14.0
IINITIALLY > 0
@BOX 18.0
R=0?
@BOX 15.0
1/R
@BOX 16.0
EXIT
@BOX 17.0
ENTER TRAP(8,12)
 0^0 OR -VE I
@BOX 1.1
PROC DIPOWER( R, I);
$RE64  RKEEP;
$IN32  COUNT,BN;
LITERAL /$RE64  ONE=           1.000000000000000 ;
@BOX 2.1
IF  I=0,
@BOX 3.1
IF  I > 0 THEN
1 => BN -:I<<- 1=>I
ELSE
-1-I<<- 1=>I;
0=>BN;
FI
@BOX 5.1
 R=>RKEEP;
IF  I=0,->B5;
B5.1:
IF  I->> 1=>I&1=0,->B5.2;
 RKEEP*R=>R;
B5.2:
IF  I=0,->B5;
 RKEEP*RKEEP=>RKEEP;
->B5.1;
B5:
@BOX 9.1
   IF   R=0.,
@BOX 10.1
 ONE => DIPOWER;
@BOX 11.1
EXIT
@BOX 14.1
   IF  BN=1,
@BOX 18.1
IF   R=0.,
@BOX 15.1
 ONE/R => R;
@BOX 16.1
 R => DIPOWER;
EXIT
END
@BOX 17.1
ENTER.TRAP(8,12);
@END
@TITLE MFN02.15(1,6)
@COL 2S-3R-4F
@FLOW 2-3-4
@BOX 2.0
PROC DLOG(P1);
@BOX 3.0
EVAL DLOG(P1)
@BOX 4.0
END
@BOX 2.1
PROC DLOG( A);
LITERAL /$RE64  C=           0.434294481903247
@BOX 3.1
 DLN(A)*C => DLOG;
@BOX 4.1
EXIT ;
END ;
@END
@TITLE MFN02.16(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DATAN2(X1,X2)
@BOX 2.0
CODE FOR DATAN2
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC DATAN2( X1,  X2);
$IN32  FL;
$RE64  MULT,RES;
LITERAL /$RE64  PI=          3.141592653589793  ;
LITERAL /$RE64  PIBY2=          1.570796326794897  ;
LITERAL /$RE64  ONE=          1.000000000000000  ;
LITERAL /$RE64  M.ONE=         -1.000000000000000  ;
IF   X1 = 0 AND   X2 = 0 THEN
ENTERTRAP(8,13);
FI ;
IF   X1< 0. THEN
 M.ONE=>MULT;
   0. -:> X1;
ELSE ;
 ONE=>MULT;
FI ;
IF   X2 < 0 THEN
   0. -:> X2;
1=>FL;
ELSE ;
0=>FL;
FI ;
IF   X2=<X1 THEN
 DATAN( X2/X1)-:PIBY2=>RES;
ELSE ;
 DATAN( X1/X2)=>RES;
FI ;
IF  FL=1 THEN
 PI-RES*MULT=>DATAN2;
EXIT ;
ELSE ;
 RES *MULT=>DATAN2;
EXIT ;
FI ;
END ;
*END
**IN -1
@END
