@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             MFN013
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
~V2 -16
                                                                       ISSUE 9~
~V2 0
~V9 -1
~P
~V9 1
~YMFN013
~S1~M~LMATHEMATICAL LIBRARY IMPLEMENTATION DESCRIPTION
~S1~M~LSection 1 Version 3
~S1~LSection 1.3 Mathematical Functions
~S1~L1. General Description
~BThis section provides machine dependent procedures for single
precision (32 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.
~BThe Mathematical Library is initially an adaptation of a set of MU5
mathematical functions. Some of the single precision functions are
therefore more precise than necessary. It is hoped to "tune" all
single precision functions to 32 bit at a later date. The complex
functions are also more precise than necessary and will be adjusted later.
~Q 22
~S1~L2. Interfaces~
~
Mathematical Library Procedures:~
~
~LSingle Precision (32 bit)~
   EXP~
   LOG~
   SIN~
   COS~
   TAN~
   ASIN~
   ACOS~
   ATAN~
   SINH~
   COSH~
   TANH~
   SQRT~
   RPOWER~
   IPOWER~
   POWER~
   ATAN2~
   LOG~
~
Other Modules Used:~
   Section  0:   (Configuration)~
~S1~L2.1 Hardware Interface
~S1~L2.2 Software Interface
~S11) EXP(X)RESULT
~BReturns ex.
~S12) LN(X)RESULT
~BReturns the natural logorithm of X.
~S13) SIN(X)RESULT
~BReturns the sin of X.
~S14) COS(X)RESULT
~BReturns cos X.
~S15) TAN(X)RESULT
~BReturns tan X. This is at present implemented by SIN(X)/COS(X).
This is not very efficient and may cause exponent overflow. It
will be rewritten at a future date.
~S16) ASIN(X)RESULT
~BReturns arcsin X in the range -P1/2 to P1/2. Implemented as ATAN[X/SQRT(1-X{2}
)].
~S17) ACOS(X)RESULT
~BReturns arcsin X in the range 0 to PI. Implemented as PI/2 - ASIN(X).
~S18) ATAN(X)RESULT
~BReturns arctan X.
(see EXP).
~S19) SINH(X)RESULT
~BReturns sinh X. Implemented as (EXP(X)+EXP(-X))/2.
~S110) COSH(X)RESULT
~BReturns cosh X. Implemented as (EXP(X)-EXP(-X))/2.
~S111) TANH(X)RESULT
~BReturns tanh X.
~S112) SQRT(X)RESULT
~BReturns the square root of X.
~S113) RPOWER(X,Y)RESULT
~BReturns X to the power of Y, where X and Y are floating point
numbers. Implemented as EXP(YLN(X)).
~S114) IPOWER(X,Y)RESULT
~BReturns X to the power of Y, where X is a floating point
number and Y an integer greater or equal to 0.
~S115) POWER(X,Y)RESULT
~BReturns X to the power of Y, where X and Y are integers
and Y is greater or equal to 0.
~S116) ATAN2(X,Y)RESULT
~BReturns arctan (X/Y).~
~S117) LOG(X)RESULT
~BReturns the logarithm to the base 10 of X.
~S1~L3. Implementation
~S1~L3.1 Outline of Operation
~BSome of these functions have been hand coded in the VAX order
code for speed. They are not portable. As there is no VAX assembler
in the MUSS system the '*#.....' facility of MUSL has been used.
For details see that particular chart concerned.
~S1~L3.2 Data Structures
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                MFN013
~V9 -1
~F
@TITLE MFN01(3,6)
@COL 1S-2F
@FLOW 1-2
@BOX 1.0
SINGLE PRECISION
MATHMATICAL FUNCTIONS
@BOX 2.0
END
@BOX 1.1
PSPEC FORM.R($IN,$RE32)/$RE32;
PSPEC R.EXP($RE32)/$IN32;
PSPEC R.MANT($RE32)/$RE32;
LSPEC ENTER.TRAP($IN,$IN);
IMPORT LITERAL MAX.EXP,MIN.EXP;
MODULE(EXP,LN,SIN,COS,TAN,ASIN,ACOS,ATAN,SINH,COSH,TANH,
        SQRT,RPOWER,IPOWER,POWER,ATAN2,LOG);
LSPEC EXP ($RE32  )/$RE32 ;
LSPEC LN ($RE32  )/$RE32 ;
LSPEC SIN ($RE32  )/$RE32 ;
LSPEC COS($RE32)/$RE32;
LSPEC TAN($RE32)/$RE32;
LSPEC ASIN($RE32)/$RE32;
LSPEC ACOS($RE32)/$RE32;
LSPEC ATAN($RE32)/$RE32;
LSPEC SINH($RE32)/$RE32;
LSPEC COSH($RE32)/$RE32;
LSPEC TANH($RE32)/$RE32;
LSPEC SQRT ($RE32  )/$RE32 ;
LSPEC ATAN2 ($RE32  ,$RE32  )/$RE32 ;
LSPEC RPOWER ($RE32  ,$RE32  )/$RE32 ;
LSPEC IPOWER ($RE32  ,$IN32  )/$RE32 ;
LSPEC LOG ($RE32  )/$RE32 ;
LSPEC POWER($IN32,$IN32)/$IN;
LITERAL/$RE32   PI = 3.141592653589793 ;
LITERAL/$RE32    PIBY2    =    1.570796326794896;
LITERAL/$RE32  MPIBY2  =  -1.570796326794896;
LITERAL/$RE32 MONE = -1. ;
#MFN01.1
#MFN01.2
#MFN01.3
#MFN01.4
#MFN01.5
#MFN01.6
#MFN01.7
#MFN01.8
#MFN01.9
#MFN01.10
#MFN01.11
#MFN01.15
#MFN01.16
#MFN01.17
#MFN01.18
#MFN01.19
#MFN01.20
@BOX 2.1
*END
@END



@TITLE MFN01.1(3,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
EXP(X)
@BOX 2.0
CODE FOR EXP
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 1.1
PROC EXP(AA);
@BOX 2.1
*#%50 %AD %1C %50 ;               :: MOVF 4(FP),R0
DATAVEC TABLE($LO16);
%4080 %0000           :: 2**(0/16) = 1.0
%4085 %AAC3           :: 2**(1/16)
%408B %95C2           :: 2**(2/16)
%4091 %C3D3           :: 2**(3/16)
%4098 %37F0           :: 2**(4/16)
%409E %F532           :: 2**(5/16)
%40A5 %FED7           :: 2**(6/16)
%40AD %583F           :: 2**(7/16)
%40B5 %04F3           :: 2**(8/16)
%40BD %08A4           :: 2**(9/16)
%40C5 %672A           :: 2**(10/16)
%40CE %248C           :: 2**(11/16)
%40D7 %44FD           :: 2**(12/16)
%40E0 %CCDF           :: 2**(13/16)
%40EA %C0C7           :: 2**(14/16)
%40F5 %257D           :: 2**(15/16)
END ;
:: SINGLE PRECISION SCALING TABLE
DATAVEC TABDB($LO16);
%4080 %0000 %0000 %0000 :: 2**(0/16) = 1.0
%4085 %AAC3 %67CC %487B :: 2**(1/16)
%408B %95C1 %E3EA %8BD7 :: 2**(2/16)
%4091 %C3D3 %73AB %11C3 :: 2**(3/16)
%4098 %37F0 %518D %B8A9 :: 2**(4/16)
%409E %F532 %6091 %A112 :: 2**(5/16)
%40A5 %FED6 %A9B1 %5139 :: 2**(6/16)
%40AD %583E %EA42 %A14B :: 2**(7/16)
%40B5 %04F3 %33F9 %DE65 :: 2**(8/16)
%40BD %08A3 %9F58 %0C37 :: 2**(9/16)
%40C5 %672A %1155 %06DB :: 2**(10/16)
%40CE %248C %151F %8481 :: 2**(11/16)
%40D7 %44FC %CAD6 %9D6B :: 2**(12/16)
%40E0 %CCDE %EC2A %94E1 :: 2**(13/16)
%40EA %C0C6 %E7DD %2439 :: 2**(14/16)
%40F5 %257D %1524 %86CC :: 2**(15/16)
END ;
:: DOUBLE PRECISION SCALING TABLE
DATAVEC EXPTAB($LO16);
%351D %9924
%3863 %5F1B
%3B75 %FDF0
%3E31 %7217
%0000 %0000
END ;
:: FIRST COEFFICIENT TABLE FOR POLYF
DATAVEC EXPTB1($LO16);
%3E2A %B333
%3F2A %B555
%3FFF %FFFF
%407F %FFFF
%4080 %0000           :: 1.00000000254251
END ;
:: SECOND COEFFICIENT TABLE FOR POLYF
DATAVEC F.16LOG2.E($LO16);
%42B8 %AA3B           :: LOG2(E) * 16
END;
*#%AB %8F %7F %80 %50 %52 ;   :: BICW3 #^X807F,R0,R2
*#%A3 %8F %00 %3E %52 %53 ;   :: SUBW3 #^X3E00,R2,R3
*#%B1 %8F %80 %05 %53 ;       :: CMPW  #^X580,R3
*#%1F %37 ;                   :: BLSSU SMTST
*#%54 %AF %E6 %29 %50 %54 %50 :: EMODF LOG(2)*16,51,R0,R4,R0
*#%55 %50 %04 %AF %B5 ;       :: POLYF R0,4,EXPTAB
*#%CB %8F %F0 %FF %FF %FF %54 %52 :: BICL3 #-16,R4,R2
*#%44 %42 %CF %E8 %FE %50 ;   :: MULF TABLE[R2],R0
*#%60 %42 %CF %22 %FF %50 ;   :: ADDD TABDB[R2],R0
*#%76 %50 %50 ;               :: CVTDF R0,R0
*#%CA %0F %54 ;               :: BICL  #15,R0
*#%13 %0B ;                   :: BEQL  RETURN
*#%7E %44 %60 %50 ;           :: MOVAQ (R0)[R4],R0
*#%B1 %50 %8F %7F %00 ;       :: CMPW  R0,#^X7F
*#%15 %1A ;                   :: BEQL  EXCEPT
*#%50 %50 %52 ;                   :: MOVF RO,R2
*#%04 ;                       :: RET
*#%19 %14 ;                   :: BLSS  EXCEPT
*#%B1 %52 %8F %00 %34 ;       :: CMPW  R2,#^X3400
*#%19 %09 ;                   :: BLSS  ONE
*#%55 %50 %04 %AF %90 ;       :: POLYF R0,4,EXPTB1
*#%50 %50 %52 ;                        :: MOVF R0,R2
*#%04 ;                       :: RET
*#%50 %08 %52 ;               :: MOVF  S^#1.0,R2
*#%04 ;                       :: RET
IF AA < 0. THEN
*#%D4 %52;                    :: CLRF D2
*#%04;                        :: RETURN
FI
ENTER.TRAP(8,10) ;
@BOX 3.1
END
@END
@TITLE MFN01.2(3,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
LN(X)
@BOX 2.0
CODE FOR LN
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 1.1
PROC LN ( AA);
@BOX 2.1
IF AA =< 0. THEN
     ENTER.TRAP(8,14) FI ;
*#%50 %52 %50 ;                         :: MOVF R2,R0
DATAVEC LOGTAB($LO32) ;
%19553F9A           :: C3 = 0.300974506
%A01E3FCC           :: C2 = 0.399659100
%AADA402A           :: C1 = 0.666669471
%00004100           :: C0 = 1.999999999
END ;
:: TABLE OF ORDERED COEFFICIENTS FOR USE IN POLY
*#%43 %08 %50 %54 ;           :: SUBF3 S^HSF 1.0,R0,R4      ; R4=X-1.0
*#%AB %8F %00 %80 %54 %51 ;   :: BICW3 #^X8000,R4,R1        ; R1=|X-1|
*#%B1 %51 %8F %80 %3F ;       :: CMPW  R1,#LF 1 OVER 4      ; CMP |X-1| & 1/4
*#%18 %16 ;                   :: BGEQ  GEQ THAN 0.25        ; branch IF >=
*#%40 %08 %50 ;               :: ADDF  S^#SF 1,R0           ; R0=X+1
*#%46 %50 %54 ;               :: DIVF  R0,R4                ; R4=W=(X-1)/(X+1)
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0             ; R0=Y=W**2
*#%55 %50 %03 %AF %D0 ;       :: POLYF R0,3,LOGTAB          ; R0=SUM(Ci*W**(i*2)
)
*#%44 %54 %50 ;               :: MULF  R4,R0                ; R0=U*SUM(Ci*W**(i*
2))
*#%50 %50 %52 ;                      :: MOVF R0,R2
*#%04 ;                       :: RSB                        ; return
*#%AA %8F %80 %7F %50 ;       :: BICW  #^X7F80,R0           ; clear R0 exp
*#%A8 %8F %00 %40 %50 ;       :: BISW  #^X4000,R0           ; make R0[1/2,1]
*#%A2 %50 %52 ;               :: SUBW  R0,R2                ; remove bias
*#%4D %52 %55 ;               :: CVTWF R2,R5                ; leave exp
*#%44 %8F %B1 %3C %18 %72 %55 :: MULF  log2/128,R5          ; compensate
*#%43 %8F %35 %40 %F3 %04 %50 %54 :: SUBF3 SQRT2/2,R0,R4    ; R4=Z-SQRT(2)/2
*#%40 %8F %35 %40 %F3 %04 %50     :: ADDF  SQRT2/2,R0       ; R0=Z+SQRT(2)/2
*#%46 %50 %54                 :: DIVF  R0,R4                ; R4=W=R4-R0
*#%45 %54 %54 %50             :: MULF3 R4,R4,R0             ; R0=Y=W**2
*#%55 %50 %03 %AF %97 ;       :: POLYF R0,3,LOGTAB          ; R0=SUM(Ci*W**(i*2)
)
*#%44 %54 %50 ;               :: MULF  R4,R0                ; R0=W*SUM(Ci*W**(i*
22))
*#%40 %8F %B1 %BF %18 %72 %50 :: ADDF  LN2/2,R0             ; R0=R0-LN(2))
*#%40 %55 %50 ;               :: ADDF  R5,R0                ; R0=W*R0
*#%50 %50 %52 ;                      :: MOVF R0,R2
*#%04 ;                       :: RSB
@BOX 3.1
END
@END
@TITLE MFN01.3(3,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
SIN(X)
@BOX 2.0
CODE FOR SIN
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 1.1
PROC SIN( AA);
#MFN01.3.1
#MFN01.3.2
ENTER.TRAP(8,17) ;
::                   FILLER
*#%00 %00 %00 %00 ;
*#%00 %00 %00 %00 %00 ;
*#%00 %00 %00 %00 %00 ;
*#%00 %00 %00 %00 %00 ;
@BOX 3.1
END
@END
@TITLE MFN01.3.1(3,7)
@COL 1S
@FLOW 1
@BOX 1.0
FIRST PART OF SINE
@BOX 1.1
*#%50 %AD %1C %54 ;           :: MOVF 1C(FP),R4
*#%19 %56 ;                   :: BLSS  NEGARG
*#%A3 %8F %00 %40 %54 %51 ;   :: SUBW3 #^X4000,R4,R1
*#%B1 %8F %00 %02 %51 ;       :: CMPW  #^X0200,R1
*#%19 %32 ;                   :: BLSS  LARGE SIN
*#%54 %8F %A2 %44 %83 %F9 %8F %6E %54 %51 %53
    :: EMODF 1024/PI,#^0156,R4,R1,R3
*#%A1 %08 %51 %52 ;           :: ADDW3 #^X8,R1,R2
*#%B3 %8F %F0 %03 %52 ;       :: BITW  #^X3F0,R2
*#%13 %23 ;                   :: BEQL  CLOSE PI
*#%9C %18 %51 %52 ;           :: ROTL  #32-8,R1,R2
*#%8A %8F %F8 %52 ;           :: BICB  #^XF8,R2
*#%8F %52 %00 %07 ;           :: CASEB R2,#0,#7
*#%AC %04 ;                        :: COS110
*#%DC %04 ;                        :: COS111
*#%56 %03 ;                        :: COS000
*#%90 %03 ;                        :: COS001
*#%C1 %03 ;                        :: COS010
*#%F2 %03 ;                        :: COS011
*#%43 %04 ;                        :: COS100
*#%7C %04 ;                        :: COS101
*#%B1 %8F %80 %0B %51 ;       :: CMPW  #^X0B80,R1
*#%1F %66 ;                   :: BLSSU SMORE1
*#%56 %54 %52 ;               :: CVTFD R4,R2
*#%74 %CF %32 %01 %2A %52 %51 %52
    :: EMODD 1024/PI,#^X2A,R2,R1,R2
*#%76 %52 %53 ;               :: CVTDF R2,R3
*#%11 %CD ;                   :: BRB   SINE1
*#%A3 %8F %00 %C0 %54 %51 ;   :: SUBW3 #^XC000,R4,R1
*#%B1 %8F %00 %02 %51 ;       :: CMPW #^X0200,R1
*#%19 %32 ;                   :: BLSS  LARGE NSINE
*#%54 %8F %A2 %C4 %83 %F9 %8F %6E %54 %51 %53
     :: EMODF 1024/PI,#^0156,R4,R1,R3
*#%A1 %08 %51 %52 ;           :: ADDW3 #^X8,R1,R2
*#%B3 %8F %F0 %03 %52 ;       :: BITW  #^X3F0,R2
*#%13 %23 ;                   :: BEQL  NSIN CLOSE PI
*#%9C %18 %51 %52 ;           :: ROTL  #32-8,R1,R2
*#%8A %8F %F8 %52 ;           :: BICB  #^XF8,R2
*#%8F %52 %00 %07 ;           :: CASEB R2,#0,#07
*#%6B %03 ;                       ::COS010
*#%9C %03 ;                       :: COS100
*#%ED %03 ;                       :: COS101
*#%26 %04 ;                       :: COS110
*#%56 %04 ; ::COMMENTS IN A MESS
*#%86 %04 ;                       :: COS111
*#%00 %03 ;                       :: COS000
*#%3A %03 ;                       :: COS001
@END
@TITLE MFN01.3.2(3,9)
@COL 1S
@FLOW 1
@BOX 1.0
SECOND PART OF SINE
@BOX 1.1
*#%B1 %8F %80 %0B %51 ;       :: CMPW  #^0B80,R1
*#%1F %2F ;                   :: BLSSU SMORE2
*#%56 %54 %52 ;               :: CVTFD R4,R2
*#%74 %CF %E4 %00 %2A %52 %51 %52
    :: EMODD 1024/PI,#^X2A,R2,R1,R2
*#%76 %52 %53 ;               :: CVTDF R2,R3
*#%11 %CD ;                   :: BRB   NSINE1
*#%E1 %0F %51 %3E ;           :: BBC   #15,R1,SBIG1
*#%B1 %8F %00 %FA %51 ;       :: CMPW  #^XFA00,R1
*#%14 %33 ;                   :: BGTR  ANSARG
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%55 %50 %03 %CF %1E %02 ;   :: POLYF R0,H03,SINTB2
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%40 %54 %50 ;               :: ADDF R4,R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%E1 %0F %51 %4C ;           :: BBC #15,R1,SBIG2
*#%B1 %8F %00 %FA %51       :: CMPW  #^XFA00,R1
*#%14 %14 ;                   :: BGTR  ANSARG
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%55 %50 %03 %CF %FF %01 ;   :: POLYF R0,#03,SINTB2
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%40 %54 %50 ;               :: ADDF  R4,R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%50 %54 %52 :: MOVF  R4,R0, CHANGED TO MOVF R4,R2
*#%04 ;                       :: RSB
*#%B1 %54 %8F %80 %4F ;       :: CMPW  R4,#WF BIG
*#%18 %53 ;                   :: BGEQ  SOVFL
*#%56 %54 %52 ;               :: CVTFD R4,R2
*#%74 %CF %93 %00 %2A %52 %51 %52
     :: EMODD 4/PI,#^X2A,R2,R1,R2
*#%76 %52 %54 ;               :: CVFDF R2,R4
*#%8A %8F %F8 %51 ;           :: BICB  #^XF8,R1
*#%8F %51 %00 %07 ;           :: CASEB R1,#0,#7
*#%07 %05 ;                          :: CBG110
*#%18 %05 ;                           :: CBG111
*#%A3 %04 ;                           :: CBG000
*#%B0 %04 ;                           :: CBG001
*#%C5 %04 ;                           :: CBG010
*#%D6 %04 ;                           :: CBG011
*#%E6 %04 ;                           :: CBG100
*#%F3 %04 ;                           :: CBG101
*#%B1 %54 %8F %80 %CF ;       :: CMPW  R4,#WF BIG
*#%18 %26 ;                   :: BGEQ  SOVFL
*#%56 %54 %52 ;               :: CVTFD R4,R2
*#%74 %CF %6E %00 %2A %52 %51 %52
      :: EMODD 4/PI,#^X2A,R2,R1,R2
*#%76 %52 %54 ;               :: CVTDF R2,R4
*#%8A %8F %F8 %51 ;           :: BICB  #^XF8,R1
*#%8F %51 %00 %07 ;           :: CASEB R1,#0,#7
*#%98 %04 ;                        :: CBG010
*#%A9 %04 ;                         :: CBG011
*#%B9 %04 ;                         :: CBG100
*#%C6 %04 ;                         :: CBG101
*#%DA %04 ;                         :: CBG110
*#%EB %04 ;                         :: CBG111
*#%76 %04 ;                         :: CBG000
*#%83 %04 ;                         :: CBG001
@END
@TITLE MFN01.4(3,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
COS(X)
@BOX 2.0
CODE FOR COS
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 1.1
PROC COS( AA);
@BOX 2.1
*#%50 %AD %1C %54       :: MOVF 1C(FP), R4
#MFN01.4.1
#MFN01.4.2
*#%CA %8F %00 %80 %00 %00 %54 :: BICL  #^X8000,R4
*#%A3 %8F %00 %40 %54 %51 ;   :: SUBW3 #^X4000,R4,R1
*#%B1 %8F %00 %02 %51 ;       :: CMPW  #^X0200,R1
*#%19 %34 ;                   :: BLSS  LARGE COS
*#%54 %8F %A2 %44 %83 %F9 %8F %6E %54 %51 %53 :: EMODF 1024/PI,#^0156,R1,R3
*#%A1 %8F %08 %02 %51 %52 ;   :: ADDW3 #^X208,R1,R2
*#%B3 %8F %F0 %03 %52 ;       :: BITW  #^X3F0,R2
*#%13 %26 ;                   :: BEQL  COS CLOSE PI
*#%9C %18 %51 %52 ;           :: ROTL  #32-8,R1,R2
*#%8A %8F %F8 %52 ;           :: BICB  #^XF8,R2
*#%8F %52 %00 %07 ;           :: CASEB R2,#0,#7
*#%2A %00 ;                          :: COS000
*#%64 %00 ;                             :: COS001
*#%95 %00 ;                             :: COS010
*#%C6 %00 ;                             :: COS011
*#%17 %01 ;                             :: COS100
*#%50 %01 ;                             :: COS101
*#%80 %01 ;                             :: COS110
*#%B0 %01 ;                             :: COS111
*#%B1 %8F %80 %0B %51 ;       :: CMPW #^X0B80,R1
*#%18 %03 ;                   :: BGEQ  COS CLOSE PI
*#%31 %E9 %01 ;               :: BRW   CMORE
*#%56 %54 %52 ;               :: CVTFD R4,R2
*#%74 %CF %03 %FE %2A %52 %51 %52 :: EMODD 1024/P1,R2,R1,R2
*#%76 %52 %53 ;               :: CVTDF R2,R3
*#%11 %CA ;                   :: BRB   COSINE1
#MFN01.4.3
#MFN01.4.4
*#%E1 %0F %51 %1C ;          :: CMORE: BBC   #15,R1,CBIG
*#%B1 %8F %00 %FA %51 ;      :: CMPW  #^XF00,R1
*#%14 %11 ;                  :: BGTR  CANS1
*#%45 %54 %54 %50 ;          :: MULF3 R4,R4,R0
*#%55 %50 %03 %CF %9C %FD ;  :: POLYF R0,#03,CSTB2
*#%40 %63 %50 ;              :: ADDF  (R3),R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                      :: RSB
*#%50 %08 %52 ;              :: MOVF  #^F1,R0, CHANGED R0 TO R2
*#%04 ;                      :: RSB
*#%B1 %54 %8F %80 %4F ;      :: CMPW  R4,#WF BIG
*#%19 %03 ;                  :: BLSS  5$
*#%31 %AB %00 ;              :: BRW   COVFL
*#%56 %54 %52 ;              :: CVTFD R4,R2
*#%74 %CF %00 %FC %2A %52 %51 %52 :: EMODD D4/PI,#^X2A,R2,R1,R2
*#%76 %52 %54 ;              :: CVTFD R2,R4
*#%8A %8F %F8 %51 ;          :: BICB  #^XF8,R1
*#%8F %51 %00 %07 ;          :: CASE  R1,#0,#7
*#%10 %00 ;                           :: CBG000
*#%1D %00 ;                              :: CBG001
*#%32 %00 ;                              :: CBG010
*#%43 %00 ;                              :: CBG011
*#%53 %00 ;                              :: CBG100
*#%60 %00 ;                              :: CBG101
*#%74 %00 ;                              :: CBG110
*#%85 %00 ;                        :: CBG111
#MFN01.4.5
ENTER.TRAP(8,18)
@BOX 3.1
END
@END
@TITLE MFN01.4.1(3,9)
@COL 1S
@FLOW 1
@BOX 1.0
POLF COEFFICIENTS FOR OCTANTS
@BOX 1.1
DATAVEC DOPS($LO32)
%F98344A2 %44156E4E :: D 1024 OPI
%F983C4A2 %44156E4E :: D N1024 OPI
%F98340A2 %44156E4E :: D 4 OPI
%F983C0A2 %44156E4E :: D N4 OPI
END;
DATAVEC BIGTAB($LO16)
%2D6F %FC16             :: 0.3410388E-11
%31FD %21EF             :: 0.1841782E-08
%B791 %E4A9             ::-0.4347956E-05
%BB99 %E2DA             ::-0.1174058E-02
%3E48 %35E8             :: 0.4887953E-01
%4060 %0000             :: 0.8750000E+00
%C060 %0000             ::-0.8750000E+00
%0000 %0000             :: 0.00000005+00
:: BIGTAB COEFFICIENTS FOR FHI = 8
%2D6A %D16D           :: 0.3336965E-11
%320D %6827           :: 0.2057740E-08
%B78E %C095           ::-0.4254349E-05
%BBAB %EE1B           ::-0.1311723E-02
%3DED %7AF4           :: 0.2898929E-01
%4060 %0000           :: 0.8750000E+00
%C060 %0000           ::-0.8750000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENT FOR FHI = 9
%2D65 %15F2           :: 0.3255504E-11
%321B %E821           :: 0.2268742E-08
%B78B %4476           ::-0.4150493E-05
%BBBD %8F54           ::-0.1446227E-02
%3CE2 %CBC6           :: 0.6921264E-02
%4060 %0000           :: 0.8750000E+00
%C060 %0000           ::-0.8750000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENTS FOR FHI = 10
%2D5E %CD2F           :: 0.3166200E-11
%322A %07F4           :: 0.2474278E-08
%B787 %7273           ::-0.4036637E-05
%BBCE %BBA5           ::-0.1577248E-02
%3E39 %41A3           :: 0.4522861E-01
%4050 %0000           :: 0.8125000E+00
%C050 %0000           ::-0.8125000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENT FOR FHI = 11
%2D57 %FB04           :: 0.3069268E-11
%3237 %BEEA            :: 0.2673853E-08
%B783 %4CE8            :: -0.3913057E-05
%BBDF %6876           ::-0.1704468E-02
%3D9B %6629           :: 0.1896961E-01
%4050 %0000           :: 0.8125000E+00
%C050 %0000           ::-0.8125000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENTS FOR FHI = 12
%2D50 %A3A5           :: 0.2964942E-11
%3245 %048E           :: 0.2866986E-08
%B77D %ACC6           ::-0.3780051E-05
%BBEF %8B7F           ::-0.1827583E-02
%3E59 %F024           :: 0.5320753E-01
%4040 %0000           :: 0.7500000E+00
%C040 %0000           ::-0.7500000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENTS FOR FHI = 13
%2D48 %CB9A           :: 0.2853473E-11
%3251 %D0B0           :: 0.3053213E-08
%B774 %2349           ::-0.3637937E-05
%BBFF %1ACC           ::-0.1946294E-02
%3DBC %806B           :: 0.2301045E-01
%4040 %0000           :: 0.7500000E+00
%C040 %0000           ::-0.7500000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENTS FOR FHI = 14
%2D40 %77B9         :: 0.2735130E-11
%325E %1B6C          :: 0.3232084E-08
%B76A %033B          :: -0.3487060E-05
%BC07 %0662          ::   -0.20603170E-02
%3E5A %EF91          :: 0.5345112E-01
%4030 %0000          :: 0.6875000E+00
%C030 %0000           ::-0.6875000E+00
%0000 %0000           :: 0.0000000E+00
:: BIGTAB COEFFICIENTS FOR FHI = 15
END;
@END
@TITLE MFN01.4.2(3,6)
@COL 1S
@FLOW 1
@BOX 1.0
OTHER POLYF COEFFICIENTS
@BOX 1.1
DATAVEC CSTB1($LO16)
%3D81 %E0F8           :: 0.1585434E-01
%BF9D %E9E6           ::-0.3084251E+00
%4080 %0000           :: 0.1000000E+01
:: COEFFICIENTS FOR CSTB1
END;
DATAVEC NCSTB1($LO16)
%BD81 %E0F8           ::-0.1585434E-01
%3F9D %E9E6           :: 0.3084251E+00
%C080 %0000           ::-0.1000000E+01
:: COEFFICIENTS FOR NCSTB1
END;
DATAVEC SNTB1($LO16)
%3C23 %35E3           :: 0.2490395E-02
%BEA5 %5DE7           ::-0.8074551E-01
%4049 %0FDB           :: 0.7853982E+00
:: COEFFICIENTS FOR SNTB1
END;
DATAVEC NSNTB1($LO16)
%BC23 %35E3           ::-0.2490395E-02
%3EA5 %5DE7           :: 0.8074551E-01
%C049 %0FDB           ::-0.7853982E+00
:: COEFFICIENTS FOR NSNTB1
END;
DATAVEC SNTB($LO16)
%9D16 %CDBE           ::-0.4989675E-21
%2823 %2F62           :: 0.2264648E-14
%B2A5 %5DDD           ::-0.4812803E-08
%3A10 %FDA9           :: 0.1382741E-03
:: COEFFICIENTS FOR SNTB
END;
DATAVEC SINTB2($LO16)
%BA4E %9C51           ::-0.1970392E-03
%3D08 %87A2           :: 0.8333119E-02
%BF2A %AAAA           ::-0.1666667E+00
%0000 %0000           :: 0.0000000E+00
:: COEFFICIENTS FOR SINTB2
END;
DATAVEC CSTB($LO16)
%A2A9 %F97E           ::-0.1151793E-17
%2D81 %E062           :: 0.3691312E-11
%B79D %E9E6           ::-0.4706194E-05
%4080 %0000           :: 0.1000000E+01
:: COEFFICIENTS FOR CSTB
END;
DATAVEC NGCSTB($LO16)
%22A9 %F97E           :: 0.1151793E-17
%AD81 %E062           ::-0.3691312E-11
%379D %E9E6           :: 0.4706194E-05
%C080 %0000           ::-0.1000000E+01
:: COEFFICIENTS FOR NGCSTB
END;
DATAVEC CSTB2($LO16)
%BBB4 %6CE6           ::-0.1376536E-02
%3E2A %A8A5           :: 0.416647AE-01
%BFFF %FFFD           ::-0.4999999E+00
%247C %4FBB           :: LOW OF C0 = 1.
%407F %FFFF           :: HIGH OF C0 = 1.
:: COEFFICIENTS FOR CSTB2
END;
@END
@TITLE MFN01.4.3(3,6)
@COL 1S
@FLOW 1
@BOX 1.0
FIRST FOUR OCTANTS
@BOX 1.1
*#%E0 %07 %51 %13 ;           :: COS000:  BBS   A7,R1,LK000
*#%4C %51 %51 ;               :: CVTBF R1,R1
*#%40 %51 %53 ;               :: ADDF  R1,R3
*#%44 %53 %53 ;               :: MULF  R3,R3
*#%55 %53 %03 %CF %57 %FF ;   :: POLYF R3,3,CSTB
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%8B %8F %F0 %51 %52 ;       :: BICB3 #^XF0,R1,R2
*#%CA %8F %8F %FF %FF %FF %51 :: BICL  #^XFFFFFF8F,R1
*#%3E %41 %CF %F2 %FD %51 ;   :: MOVAW BIGTAB[R1],R1
*#%4C %52 %52 ;               :: CVTBF R2,R2
*#%40 %52 %53 ;               :: ADDF  R2,R3
*#%55 %53 %04 %61 ;           :: POLYF R3,#4,(R1)
*#%40 %63 %50 ;               :: ADDF  (R3),R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%A8 %8F %00 %FF %51 ;       :: COS001: BISW  #^XFF00,R1
*#%4D %51 %7E ;               :: CVTWF R1,-(SP)
*#%41 %53 %6E %54 ;           :: ADDF3 R3,(SP),R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%45 %8F %40 %BC %00 %00 %53 %7E :: MULF3 #^XBC40,R3,-(SP)
*#%55 %50 %03 %CF %F2 %FE ;   :: POLYF R0,#3,SNTB
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%43 %50 %8E %50 ;           :: SUBF3 R0,(SP)+,R0
*#%45 %8F %40 %BC %00 %00 %8E %52 :: MULF3 #^XBC40,(SP)+,R2
*#%40 %50 %52 ;               :: ADDR  R2,R0, CHANGED TO ADDR R0,R2
*#%04 ;                       :: RSB
*#%AA %8F %00 %FF %51 ;       :: COS010: BICW  #^XFF00,R1
*#%4D %51 %7E ;               :: CVTWF R1,-(SP)
*#%41 %53 %6E %54 ;           :: ADDF3 R3,(SP),R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%45 %8F %40 %BC %00 %00 %53 %7E :: MULF3 #^XBC40,R3,-(SP)
*#%55 %50 %03 %CF %C1 %FE ;   :: POLYF R0,#3,SNTB
*#%44 %54 %50 ;               :: MULF R4,R0
*#%43 %50 %8E %50 ;           :: SUBF3 R0,(SP)+,R0
*#%45 %8F %40 %BC %00 %00 %8E %52 :: MULF3 #^XBC40,(SP)+,R2
*#%40 %50 %52 ;               :: ADDF R2,R0, ,CHANGED TO ADDF R0,R2
*#%04 ;                       :: RSB
*#%9B %51 %51 ;               :: COS011: MOVZBW R1,R1
*#%AE %51 %51 ;               :: MNEGW R1,R1
*#%95 %51 ;                   :: TSTB  R1
*#%15 %13 ;                   :: BLEQ  LK011
*#%4C %51 %51 ;               :: CVTBF R1,R1
*#%42 %53 %51 ;               :: SUBF  R3,R1
*#%44 %51 %51 ;               :: MULF  R1,R1
*#%55 %51 %03 %CF %C5 %FE ;   :: POLYF R1,#03,NGCSTB
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%13 %22 ;                   :: BEQL  HIZ011
*#%8B %8F %F0 %51 %52 ;       :: BICB3 #^XF0,R1,R2
*#%CA %8F %8F %FF %FF %FF %51 :: BICL  #^XFFFFFF8F,R1
*#%3E %41 %CF %4E %FD %51 ;   :: MOVAW BIGTAB[R1],R1
*#%4C %52 %52 ;               :: CVTBF R2,R2
*#%42 %53 %52 ;               :: SUBF  R3,R2
*#%55 %52 %04 %61 ;           :: POLYF R2,#04,(R1)
*#%43 %50 %A3 %04 %52 ;       :: SUBF3 R0,4(R3),R0, CHANGED TO SUBF3 R0,4(R3),R2
*#%04 ;                       :: RSB
*#%43 %53 %28 %53 ;           :: SUBF3 R3,#^X4280,R3
*#%55 %53 %04 %CF %13 %FE ;   :: POLYF R3,#04,BIGTAB15
*#%43 %50 %A3 %04 %52 ;       :: SUBF3 R0,4(R3),R0, CHANGED SUBF3 R0,4(R3),R2
*#%04 ;                       :: RSB
@END
@TITLE MFN01.4.4(3,6)
@COL 1S
@FLOW 1
@BOX 1.0
SECOND FOUR OCTANTS
@BOX 1.1
*#%E0 %07 %51 %13 ;           :: COS100: BBS   #7,R1,LK100
*#%4C %51 %51 ;               :: CVTBF R1,R1
*#%40 %51 %53 ;               :: ADDF  R1,R3
*#%44 %53 %53 ;               :: MULF  R3,R3
*#%55 %53 %03 %CF %7A %FE ;   :: POLYF R3,#03,NGCSTB
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%8B %8F %F0 %51 %52 ;       :: BICB5 #^XF0,R1,R2
*#%CA %8F %8F %FF %FF %FF %51 :: BICL #^XFFFFFF8F,R1
*#%3E %41 %CF %05 %FD %51 ;   :: MOVAW BIGTAB[R1],R1
*#%4C %52 %52 ;               :: CVTBF R2,R2
*#%40 %52 %53 ;               :: ADDF  R2,R3
*#%55 %53 %04 %61 ;           :: POLYF R3,#04,(R1)
*#%43 %50 %A3 %04 %52 ;       :: SUBF3 R0,4(R3),R0, CHANGED TO SUBF3 R0,4(R3),R2
*#%04 ;                       :: RSB
*#%A8 %8F %00 %FF %51 ;       :: COS101: BISW  #^XFF00,R1
*#%4D %51 %7E ;               :: CVTWF R1,-(SP)
*#%41 %53 %6E %54 ;           :: ADDF3 R3,(SP)R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%45 %8F %40 %3C %00 %00 %53 %7E :: MULF3 #^X3C40,R3,-(SP)
*#%55 %50 %03 %CF %06 %FE ;   :: POLYF R0,#03,SNTB
*#%44 %54 %50                 :: MULF R4,R0
*#%40 %8E %50 ;               :: ADDF  (SP)+,R0
*#%45 %8F %40 %3C %00 %00 %8E %52 :: MULF3 #^X3C40,(SP)+,R2
*#%40 %50 %52 ;               :: ADDF R2,R0, CHANGED TO ADDF R0,R2
*#%04 ;                       :: RSB
*#%AA %8F %00 %FF %51 ;       :: COS110: BICW  #^XFF00,R1
*#%4D %51 %7E ;               :: CVTWF R1,-(SP)
*#%41 %53 %6E %54 ;           :: ADDF3 R3,(SP),R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%45 %8F %40 %3C %00 %00 %53 %7E :: MULF3 #^X3C40,R3,-(SP)
*#%55 %50 %03 %CF %D6 %FD ;   :: POLYF R0,#03,SNTB
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%40 %8E %50 ;               :: ADDF  (SP)+,R0
*#%45 %8F %40 %3C %00 %00 %8E %52 :: MULF3 #^X3C40,(SP)+,R2
*#%40 %50 %52 ;               :: ADDF  R2,R0, CHANGED T0 ADDF R2, R0
*#%04 ;                       :: RSB
*#%9B %51 %51 ;               :: COS111: MOVZBW R1,R1
*#%AE %51 %51 ;               :: MNEGW R1,R1
*#%95 %51 ;                   :: TSTB  R1
*#%15 %13 ;                   :: BLEQ  LK111
*#%4C %51 %51 ;               :: CVTBF R1,R1
*#%42 %53 %51 ;               :: SUBF  R3,R1
*#%44 %51 %51 ;               :: MULF  R1,R1
*#%55 %51 %03 %CF %CB %FD ;   :: POLYF R1,#03,CSTB
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%13 %23 ;                   :: BEQL  HIZ111
*#%8B %8F %F0 %51 %52 ;       :: BICB3 #^XF0,R1,R2
*#%CA %8F %8F %FF %FF %FF %51 :: BICL  #^XFFFFFF8F,R1
*#%3E %41 %CF %64 %FC %51 ;   :: MOVAW BIGTAB[R1],R1
*#%4C %52 %52 ;               :: CVTBF R2,R2
*#%42 %53 %52 ;               :: SUBF  R3,R2
*#%55 %52 %04 %61 ;           :: POLYF R3,#04,(R1)
*#%40 %63 %50 ;               :: ADDF  (R3),R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                      :: RSB
*#%43 %53 %28 %53 ;          :: SUBF3 R3,#^X4280,R3
*#%55 %53 %04 %CF %28 %FD ;  :: POLYF R3,#04,BIGTAB15
*#%40 %63 %50 ;              :: ADDF  (R3),R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                      :: RSB
@END
@TITLE MFN01.4.5(3,6)
@COL 1S
@FLOW 1
@BOX 1.0
OTHER RANGES
@BOX 1.1
*#%44 %54 %54 ;               :: CBG000: MULF  R4,R4
*#%55 %54 %02 %CF %E8 %FC ;   :: POLYF R4,#02,CSTB1
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%43 %54 %08 %54 ;           :: CBG001: SUBF3 R4,#^F1,R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%55 %50 %02 %CF %EE %FC ;   :: POLYF R0,#02,SNTB1
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%45 %54 %54 %50 ;           :: CBG010: MULF3 R4,R4,R0
*#%55 %50 %02 %CF %E9 %FC ;   :: POLYF R0,#02,NSTB1
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%42 %08 %54 ;               :: CBG011: SUBF  #^F1,R4
*#%44 %54 %54 ;               :: MULF  R4,R4
*#%55 %54 %02 %CF %BE %FC ;   :: POLYF R4,#02,NCSTB1
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%44 %54 %54 ;               :: CBG100: MULF  R4,R4
*#%55 %54 %02 %CF %B1 %FC ;   :: POLYF R4,#02,NCSTB1
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%42 %08 %54 ;               :: CBG101: SUBF  #^F1,R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%55 %50 %02 %CF %AC %FC ;   :: POLYF R0,#02,SNTB1
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%45 %54 %54 %50 ;           :: CBG110: MULF3 R4,R4,R0
*#%55 %50 %02 %CF %9B %FC ;   :: POLYF R0,#02,SNTB1
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
*#%42 %08 %54 ;               :: CBG111: SUBF  #^F1,R4
*#%44 %54 %54 ;               :: MULF  R4,R4
*#%55 %54 %02 %CF %70 %FC ;   :: POLYF R4,#02,CSTB1
*#%50 %50 %52 ;      :: MOVF R0, R2
*#%04 ;                       :: RSB
@END
@TITLE MFN01.5(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TAN
@BOX 2.0
TAN = SIN/COS
(NOT VERY EFFICIENT)
@BOX 3.0
END
@BOX 1.1
PROC TAN(X);
@BOX 2.1
SIN(X)/COS(X) => TAN :: MAY CAUSE EXPONENT OVERFLOW

@BOX 3.1
END
@END
@TITLE MFN01.6(3,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ASIN
@BOX 2.0
ASIN = ATAN(X/SQRT(1-X*X))
@BOX 3.0
END
@BOX 1.1
PROC ASIN(X);
$RE32 Y;
@BOX 2.1
IF X = 0. THEN  0. => ASIN
 ELSE IF X = 1. THEN PIBY2 => ASIN
 ELSE IF X = MONE THEN MPIBY2 => ASIN
 ELSE IF X < 0.9999999999 AND X > MONE THEN
SQRT(X*X-:1.) => Y; :: NEEDS SENSIBLE ARGUMENT;
ATAN(X/Y) => ASIN;
ELSE;
ENTER.TRAP(8,15) FI FI FI
FI;
@BOX 3.1
END;
@END
@TITLE MFN01.7(3,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ACOS
@BOX 2.0
ACOS = PI/2 - ASIN
@BOX 3.0
END
@BOX 1.1
PROC ACOS(X);
@BOX 2.1
IF X = 0. THEN PIBY2 => ACOS
 ELSE IF X = 1. THEN 0. => ACOS
 ELSE IF X = MONE THEN PI => ACOS
 ELSE IF X > MONE < 1. THEN
::    ATAN(SQRT(X*X-:1.)/X) => ACOS
::  ELSE IF X > MONE < 0. THEN
::    ATAN(SQRT(X*X-:1.)/X) + PI => ACOS
 PIBY2 - ASIN(X) => ACOS
ELSE ENTER.TRAP(8,16) FI FI FI FI
:: FI
@BOX 3.1
END;
@END
@TITLE MFN01.8(3,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ATAN(X)
@BOX 2.0
CODE FOR ATAN
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 1.1
PROC ATAN ( AA);
@BOX 2.1
*#%50 %AD %1C %50 ;                 :: MOVF 1C(FP),R0
*#%10 %19		::BSBB SUBRTN
*#%04			::RET
DATAVEC ATANTAB($LO16);
%3EC5 %3AC2           :: C4 = 0.0963034789
%BF11 %5D4C           :: C3 =-0.1419574624
%3F4C %C6DB           :: C2 = 0.1999773201
%BFAA %AAA4           :: C1 =-0.3333331319
%4080 %0000           :: C0 = 0.9999999999
END ;
:: TABLE OF COEFFICIENTS FOR USE IN POLY
*#%53 %50 ;                   ::SUBRTN:  TSTF  R0                   ; test sign
*#%18 %14 ;                   :: BGEQ  POSTAN
*#%AA %8F %00 %80 %AD %1C ;       :: BICW  #^8000,1C(FP)
ATAN(AA);
*#%52 %52 %52 ;               :: MNEGF R0,R0
*#%05 ;                       :: RSB
*#%51 %50 %08 ;               ::POSTAN:  CMPF  R0,#1
*#%15 %12 ;                   :: BLEQ  LEQ THAN 1
*#%47 %50 %08 %50 ;           :: DIVF3 R0,#1,R0
*#%10 %0C ;                   :: BSBB  LEQ THAN 1
*#%43 %50 %8F %C9 %40 %DB %0F %50 :: SUBF3 R0,#PI/2,R0
*#%50 %50 %52 ;                 :: MOVF R0,R2
*#%05 ;                       :: RSB
*#%51 %50 %8F %89 %3F %A3 %30 :: CMPF  R0,#TAN(PI/12)
*#%15 %2C ;                   :: BLEQ  LE TAN PI OV 12
*#%45 %8F %DD %40 %D7 %B3 %50 %54 :: MULF3 #SQRT(3),R0,R4
*#%42 %08 %54 ;               :: SUBF  #1,R4
*#%40 %8F %DD %40 %D7 %B3 %50 :: ADDF  #SQRT(3),R0
*#%46 %50 %54 ;               :: DIVF  R0,R4
*#%45 %54 %54 %50 ;           :: MULF3 R4,R4,R0
*#%55 %50 %04 %AF %96 ;       :: POLYF R0,4,ATANTAB
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%40 %8F %06 %40 %92 %0A %50 :: ADDF  #PI/6,R0
*#%50 %50 %52 ;                     :: MOVF R0,R2
*#%05 ;                       :: RSB
*#%50 %50 %54 ;               :: MOVF  R0,R4
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%55 %50 %04 %CF %7C %FF ;       :: POLYF R0,4,ATANTAB
*#%44 %54 %50 ;               :: MULF  R4,R0
*#%50 %50 %52 ;                         ::MOVF R0,R2
*#%05 ;                       :: RSB
@BOX 3.1
END
@END
@TITLE MFN01.9(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
SINH
@BOX 2.0
E^X - E^-X/2
(INACCURATE 1X1<1)
@BOX 3.0
END
@BOX 1.1
PROC SINH(X);
@BOX 2.1
EXP(X) - EXP(0.-X)/2. => SINH;
@BOX 3.1
END;
@END
@TITLE MFN01.10(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
COSH
@BOX 2.0
E^X + E^-X/2
@BOX 3.0
END
@BOX 1.1
PROC COSH(X);
@BOX 2.1
EXP(X) + EXP(0.-X) /2. => COSH;
@BOX 3.1
END;
@END
@TITLE MFN01.11(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TANH(X)
@BOX 2.0
CODE FOR TANH
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC TANH( AA);
$RE32  XX,XSQ;
LITERAL /$RE32     C1   =            18.368410284838496  ;
LITERAL /$RE32     C2   =             0.162870578986080  ;
LITERAL /$RE32     P7   =             0.003592128036572  ;
LITERAL /$RE32     P6   =            -0.001455834387051  ;
LITERAL /$RE32     P5   =            -0.008863235529902  ;
LITERAL /$RE32     P4   =             0.021869488536155  ;
LITERAL /$RE32     P3   =            -0.053968253968254  ;
LITERAL /$RE32     P2   =             0.133333333333333  ;
LITERAL /$RE32     P1   =            -0.333333333333333  ;
LITERAL /$RE32     P0   =             1.000000000000000  ;
LITERAL /$RE32     ONE   =             1.000000000000000  ;
LITERAL /$RE32     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 => TANH;
EXIT ;
ELSE ;
 0. - XX => TANH;
EXIT ;
FI ;
UNITY:  ONE => XX;
->EXITE;
L2:  EXP(TWO*XX)+ONE /: TWO -: ONE => XX;
->EXITE;
END ;
@END
@TITLE MFN01.15(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
SQRT(X)
@BOX 2.0
CODE FOR SQRT
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 1.1
PROC SQRT( AA);
@BOX 2.1
*#%50 %AD %1C %50 ;            :: MOVF 1C(FP),R0
*#%50 %50 %51 ;               :: MOVF R0,R1
*#%15 %58 ;                   :: BLEQ ZERO NEG
*#%D4 %7E ;                   :: CLRL -(SP)
*#%3C %50 %52 ;               :: MOVZWL R0,R2
*#%94 %52 ;                   :: CLRB  R2
*#%AA %52 %50 ;               :: BICW  R2,R0
*#%95 %50 ;                   :: TSTB  R0
*#%18 %10 ;                   :: BGEQ  EVEN
*#%44 %8F %D4 %5F %CD %13 %50 :: MULF  ODD A E63,R0
*#%40 %8F %18 %20 %4A %3C %50 :: ADDF  ODD B EM63,R0
*#%11 %13 ;                   :: BRB   ADJUST
*#%A0 %8F %00 %20 %50 ;       :: ADDW  #^X2000,R0
*#%44 %8F %15 %40 %1A %F6 %50 :: MULF  EVEN A,R0
*#%40 %8F %D7 %1F %23 %4B %50 :: ADDF  EVEN B EM64,R0
*#%9C %1F %52 %52 ;           :: ROTL  #31,R2,R2
*#%A0 %52 %50 ;               :: ADDW  R2,R0
*#%47 %50 %51 %52 ;           :: DICF3 R0,R1,R2
*#%40 %52 %50 ;               :: ADDF  R2,R0
*#%A2 %8F %80 %00 %50 ;       :: SUBW  #^X80,R0
*#%DD %51 ;                   :: PUSHL R1
*#%D4 %51 ;                   :: CLRL  R1
*#%67 %50 %8E %51 ;           :: DIVD3 R0,(SP)+,R1
*#%40 %51 %50 ;               :: ADDF  R1,R0
*#%A2 %8F %80 %00 %50 ;       :: SUBW  #^X80,R0
*#%50 %50 %52 ;               :: MOVF R0,R2
*#%04 ;                       :: RSB
*#%13 %FA ;                   :: BEQL  SQRTX
ENTER.TRAP(8,11) ;
@BOX 3.1
END
@END
@TITLE MFN01.16(3,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
RPOWER
@BOX 2.0
RPOWER (P1,P2)
@BOX 3.0
P1 = 0?
@BOX 4.0
RESULT =
EXP (P2*LN(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 RPOWER( P1, P2);
@BOX 3.1
IF   P1=0.,
@BOX 4.1
 EXP(LN(P1)*P2)=>RPOWER;
@BOX 6.1
EXIT
END
@BOX 7.1
IF   P2=0.,
@BOX 8.1
0.=>RPOWER;
@BOX 10.1
ENTER.TRAP(8,12);
@END
@TITLE MFN01.17(3,10)
@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
IPOWER(R,I)
@BOX 2.0
I=0?
@BOX 3.0
NEGATE I IF NEGATIVE
@BOX 5.0
CALC R**I=>R
@BOX 8.0
IPOWER
@BOX 9.0
R=0?
@BOX 10.0
RESULT=1
@BOX 11.0
EXIT
@BOX 14.0
I INITIALLY > 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
LIPOWER:
PROC IPOWER( R, I);
$RE32  RKEEP;
$IN32  COUNT,BN;
LITERAL /$RE32  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<2,->B5;
 RKEEP*RKEEP=>RKEEP;
->B5.1;
B5:
@BOX 9.1
   IF   R=0.,
@BOX 10.1
 ONE => IPOWER;
@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 => IPOWER;
EXIT
END
@BOX 17.1
ENTER.TRAP(8,12);
@END
@TITLE MFN01.18(3,6)
@COL 9R-10R
@COL 1S-2T-3T-4T-5T-6T-7R-8F
@COL 11T-12R-13R
@COL 14R-15R
@ROW 3-11
@ROW 9-6
@ROW 7-13-14
@FLOW 1-2NO-3NO-4NO-5NO-6NO-7-8
@FLOW 2YES-11NO-12-14-15
@FLOW 11YES-14
@FLOW 3YES-9-10
@FLOW 4YES-8
@FLOW 5YES-9
@FLOW 6YES-13-14
@BOX 1.0
POWER(I,J)
IS**IS
@BOX 2.0
I=0?
@BOX 3.0
I=1?
@BOX 4.0
J=1?
@BOX 5.0
J=0?
@BOX 6.0
J<0?
@BOX 7.0
FORM I**J
@BOX 8.0
END
@BOX 11.0
J/=0?
@BOX 10.0
RETURN
@BOX 9.0
SET RESULT TO 1
@BOX 13.0
FAULT -VE EXPONENT
ENTERTRAP(8,12)
@BOX 12.0
FAULT 0**0
ENTERTRAP(8,12)
@BOX 14.0
SET RESULT TO 0
@BOX 15.0
RETURN
@BOX 1.1
LPOWER:;
PROC POWER(I,J);
$IN32 [1] CONTROL;
$IN32  IT,JT;
@BOX 2.1
I => IT;
IF  I=0,
@BOX 3.1
IF  I=1,
@BOX 4.1
IF  J=1,
@BOX 5.1
IF  J=0,
@BOX 6.1
IF  J<0,
@BOX 7.1
2 => JT;
1 => CONTROL[ 0];
WHILE [CONTROL[ 0]=1 ]
DO
IT *> IT;
IF JT <<- 1 => JT >= J
THEN 0 => CONTROL[ 0];
FI;
OD;
IF  JT ->> 1 => JT /= J THEN
  1 => CONTROL[ 0];
WHILE [CONTROL[ 0]=1 ]
DO
;
  I *> IT;
  IF 1+>JT=J
THEN 0 => CONTROL[ 0];
FI;
OD;
FI ;
@BOX 8.1
IT => POWER;
END ;
@BOX 11.1
IF  J/=0,
@BOX 10.1
EXIT ;
@BOX 9.1
1. => POWER;
@BOX 13.1
ENTER.TRAP(8,12);
@BOX 12.1
ENTER.TRAP(8,12);
@BOX 14.1
0. => POWER;
@BOX 15.1
EXIT ;
@END


@TITLE MFN01.19(3,6)
@COL 2S-3R-4F
@FLOW 2-3-4
@BOX 2.0
PROC LOG(P1);
@BOX 3.0
EVAL LOG(P1)
@BOX 4.0
END
@BOX 2.1
PROC LOG( A);
LITERAL /$RE32  C=           0.434294481903247
@BOX 3.1
 LN(A)*C => LOG;
@BOX 4.1
EXIT ;
END ;
@END
@TITLE MFN01.20(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ATAN2(X1,X2)
@BOX 2.0
CODE FOR ATAN2
@BOX 3.0
FOR DESCRIPTION SEE
IMPLEMENTATION MANUAL
@BOX 2.1
PROC ATAN2( X1,  X2);
$IN32  FL;
$RE32  MULT,RES;
LITERAL /$RE32  PI=          3.141592653589793  ;
LITERAL /$RE32  PIBY2=          1.570796326794897  ;
LITERAL /$RE32  ONE=          1.000000000000000  ;
LITERAL /$RE32  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
 ATAN( X2/X1)-:PIBY2=>RES;
ELSE ;
 ATAN( X1/X2)=>RES;
FI ;
IF  FL=1 THEN
 PI-RES*MULT=>ATAN2;
EXIT ;
ELSE ;
 RES *MULT=>ATAN2;
EXIT ;
FI ;
END ;
@END

