@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             MFN027
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
~V2 -16
                                                                       ISSUE 6~
~V2 0
~V9 -1
~P
~V9 1
~YMFN027
~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 dependent procedures for
double precision (64 bit)
mathematical functions for MU6G using hardware functions where provided.
~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                MFN027
~V9 -1
~F
@TITLE MFN02(7,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(7,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DEXP(X)
@BOX 2.0
CODE FOR DEXP
@BOX 3.0
USES HARDWARE FN
@BOX 2.1
PROC DEXP( AA);
AA;
*#%081C;
*#%00C2;
$IN I;
END ;
@END
@TITLE MFN02.2(7,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DLN(X)
@BOX 2.0
CODE FOR DLN
@BOX 3.0
USES HARDWARE FN
@BOX 2.1
PROC DLN ( AA);
$RE64  EXP,CJ,CONST,XX;
AA;
*#%081B;
*#%00C2;
END ;
@END
@TITLE MFN02.3(7,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DSIN(X)
@BOX 2.0
CODE FOR DSIN
@BOX 3.0
USES HARDWARE FN
@BOX 2.1
PROC DSIN( AA);
AA;
*#%081E;
*#%00C2;
END ;
@END
@TITLE MFN02.4(7,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DCOS(X)
@BOX 2.0
CODE FOR DCOS
@BOX 3.0
USES HARDWARE FN
@BOX 2.1
PROC DCOS( AA);
AA;
*#%0816;
*#%00C2;
END ;
@END
@TITLE MFN02.5(7,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(7,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(7,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(7,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DATAN(X)
@BOX 2.0
CODE FOR DATAN
@BOX 3.0
USES HARDWARE FN
@BOX 2.1
PROC DATAN ( AA);
AA;
*#%0819;
*#%00C2;
END ;
@END
@TITLE MFN02.9(7,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(7,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(7,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(7,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DSQRT(X)
@BOX 2.0
CODE FOR DSQRT
@BOX 3.0
USES HARDWARE FN
@BOX 2.1
PROC DSQRT( AA);
AA;
*#%801A;
*#%0083;
END ;
@END
@TITLE MFN02.13(7,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(7,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(7,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(7,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
