(FILECREATED "24-JAN-84 11:03:16" {SDCRDCF}</EA/DARREL/DARRELJ>TRANSCEND.;1 7359
changes to: (VARS TRANSCENDCOMS)
(FNS ANTILOG ARCSIN ARCTAN LOG SIN SQRT TAN TANSERIES))
(PRETTYCOMPRINT TRANSCENDCOMS)
(RPAQQ TRANSCENDCOMS ((FNS ANTILOG ARCSIN ARCTAN LOG SIN SQRT TAN TANSERIES)))
(DEFINEQ
(ANTILOG
[LAMBDA (X) (* DJVB "19-JAN-84 15:56")
(PROG ((EXP (FIX X / .6931472))
(FRAC (ABS (FREMAINDER X .6931472)))
(SSUM -.0001413161)) (* POLYNOMIAL FROM HANDBOOK OF MATHEMATICAL
FUNCTIONS (EDITED BY ARAMOWITZ) PAGE 71
ACCURACY 32 BITS OF THE 24 AVAILABLE!)
(for COEF in '(.001329882 -.00830136 .04165735 -.1666653 .4999999 -1.0
1.0)
do SSUM ← (FPLUS (FTIMES SSUM FRAC)
COEF))
(if (FGREATERP X 0)
then SSUM ← 1.0 / SSUM)
(* DEPENDS ON USE OF IEEE-488 FORMAT TO SMASH THE EXPONENT. COMING IN, SSUM IS IN THE
RANGE .5 TO 2 (AND SERIES PRODUCED .5 TO 1))
(\PUTBASE SSUM 0 128 * EXP + (\GETBASE SSUM 0))
(RETURN SSUM])
(ARCSIN
[LAMBDA (X RADIANSFLG) (* DJVB "23-JAN-84 10:25")
(PROG ((SIGN (if (FLESSP X 0)
then -1.0
else 1.0))
(SSUM -.001262491)
(PI/2 1.570796)
(180/PI 57.29578)) (* POLYNOMIAL FROM HANDBOOK OF MATHEMATICAL
FUNCTIONS (EDITED BY ARAMOWITZ) PAGE 81
ACCURACY 28 BITS)
(if (FLESSP X -1.0) or (FGREATERP X 1.0)
then (ERROR "ARCSIN: arg not in range" X))
(X ← (FLOAT (ABS X)))
(for COEF in '(.00667009 -.01708813 .03089188 -.0501743 .088979
-.2145988 1.570796)
do SSUM ← (FPLUS (FTIMES SSUM X)
COEF))
[SSUM ← (FTIMES SIGN (FDIFFERENCE PI/2 (FTIMES (SQRT 1.0 - X)
SSUM]
(RETURN (if RADIANSFLG
then SSUM
else (FTIMES SSUM 180/PI])
(ARCTAN
[LAMBDA (X RADIANSFLG) (* DJVB "20-JAN-84 16:59")
(PROG (FLIPPED X2 (SSUM .002866226)
(180/PI 57.29578)
(PI/2 1.570796)
(-PI/2 -1.570796)) (* POLYNOMIAL FROM HANDBOOK OF MATHEMATICAL
FUNCTIONS (EDITED BY ARAMOWITZ) PAGE 81
ACCURACY 28 BITS)
(if (FLESSP X -1.0) or (FGREATERP X 1.0)
then FLIPPED ← (if (FLESSP X 0.0)
then FLIPPED ← -PI/2
else FLIPPED ← PI/2)
X ← 1.0 / X)
(X2 ← (FTIMES X X))
(for COEF in '(-.01616574 .04290961 -.07528964 .1065626 -.142089
.1999355 -.3333315 1.0)
do SSUM ← (FPLUS (FTIMES SSUM X2)
COEF))
(SSUM ← (FTIMES SSUM X))
(SSUM ← (if FLIPPED
then (FDIFFERENCE FLIPPED SSUM)
else SSUM))
(RETURN (if RADIANSFLG
then SSUM
else (FTIMES SSUM 180/PI])
(LOG
[LAMBDA (X) (* DJVB "23-JAN-84 10:26")
(SELECTQ (SYSTEMTYPE)
[D (PROG ((SX (X + 0.0))
EXP
(SSUM -.006453544)
(LN2 .6931472)
(2↑-126 1.175494E-38))
(if ~ (FGREATERP X 0.0)
then (ERROR "LOG OF NON-POSITIVE NUMBER:" X))
(* DEPENDS ON INTERLISP D%'S USE OF IEEE 32 BIT FLOAT FORMAT INTERNALLY AND SMASHES THE
NUMBER TO THE RANGE 1 TO 2 AND SAVES THE EXPONENT)
(EXP ← (while (FLESSP SX 2↑-126)
count SX ← SX * 2.0))
(EXP ← (LRSH (LOGAND (\GETBASE SX 0)
32640)
7)
- 127 - EXP)
(\PUTBASE SX 0 16256 + (LOGAND (\GETBASE SX 0)
127))
(SX ← SX - 1.0) (* POLYNOMIAL FROM HANDBOOK OF MATHEMATICAL
FUNCTIONS (EDITED BY ARAMOWITZ) PAGE 69
ACCURACY 28 BITS)
(for COEF
in '(.03608849 -.0953294 .1676541 -.2407338 .331799
-.4998741 .9999964 0.0)
do SSUM ← (FPLUS (FTIMES SSUM SX)
COEF))
(RETURN (FPLUS SSUM (FTIMES LN2 EXP]
(HELP "MACHINE DEPENDENT LOG ON WRONG MACHINE"])
(SIN
[LAMBDA (X RADIANSFLG) (* DJVB "23-JAN-84 10:27")
(PROG (X2 (2PI 6.283185)
(PI/180 .01745329)
(-PI/2 -1.570796)
(3PI/2 4.712389)
(PI/2 1.570796)
(PI 3.141593)
(SUMMATION -2.39E-8)) (* POLYNOMIAL APPROXIMATION FROM HANDBOOK OF
MATHEMATICAL FUNCTIONS
(EDITED BY ABRAMOWITZ) PAGE 76 ACCURATE TO 26
BITS (OF 24 AVAILABLE IN DOLPHIN))
(if RADIANSFLG
then X ← (FREMAINDER X 2PI)
else X ← (FTIMES (FREMAINDER X 360.0)
PI/180))
(if (FLESSP X -PI/2)
then X ← (FPLUS X 2PI))
(if (FGREATERP X 3PI/2)
then X ← (FDIFFERENCE X 2PI)
elseif (FGREATERP X PI/2)
then X ← (FDIFFERENCE PI X))
(X2 ← (FTIMES X X))
(for COEF in '(2.7526E-6 -.000198409 .008333332 -.1666667 1.0)
do SUMMATION ← (FPLUS (FTIMES SUMMATION X2)
COEF))
(RETURN (FTIMES SUMMATION X])
(SQRT
[LAMBDA (X) (* DJVB "23-JAN-84 10:29")
(SELECTQ (SYSTEMTYPE)
(D (PROG ((P .75))
(DECLARE: LOCALVARS P)
(if (FLESSP X 0.0)
then (ERROR "SQRT of negative value" X)
elseif (FEQP X 0.0)
then (RETURN X))
(X ← (FLOAT X))
(* FOLLOWING depends on Interlisp D%'s use of IEEE 32-bit float format.
Initial guess is 1 * 2↑half-of-exponent or 1.5 * for odd exponent.
Worst case convergence is 4 steps!)
(\PUTBASE P 0 (LOGAND (\GETBASE X 0)
32767)/ 2 + 8128)
(for I from (if (FLESSP X 1.175494E-38)
then 12
else 4)
to 1 by -1 do P ← (FQUOTIENT (FPLUS P (FQUOTIENT X P))
2))
(RETURN P)))
(HELP "Machine specific sqrt on wrong machine"])
(TAN
[LAMBDA (X RADIANSFLG) (* DJVB "17-JAN-84 16:44")
(PROG ((PI 3.141593)
(PI/2 1.570796)
(-PI/2 -1.570796)
(PI/4 .7853982)
(-PI/4 -.7853982)
(PI/180 .01745329))
(if RADIANSFLG
then X ← (FREMAINDER X PI)
else X ← (FTIMES (FREMAINDER X 180)
PI/180))
(if (FGREATERP X PI/2)
then X ← (FDIFFERENCE X PI)
elseif (FLESSP X -PI/2)
then X ← (FPLUS X PI))
(RETURN (if (FGREATERP X PI/4)
then 1.0 / (TANSERIES (FDIFFERENCE PI/2 X))
elseif (FLESSP X -PI/4)
then 1.0 / (TANSERIES (FDIFFERENCE -PI/2 X))
else (TANSERIES X])
(TANSERIES
[LAMBDA (X) (* DJVB "23-JAN-84 10:29")
(PROG ((SSUM .00951681)
(X2 (FTIMES X X))) (* POLYNOMIAL APPROXIMATION FROM HANDBOOK OF
MATHEMATICAL FUNCTIONS
(EDITED BY ABRAMOWITZ) PAGE 76 GOOD TO ALMOST
26 BITS)
(for COEF in '(.002900525 .02456509 .05337406 .1333924 .3333314 1.0)
do SSUM ← (FPLUS (FTIMES SSUM X2)
COEF))
(RETURN (FTIMES X SSUM])
)
(DECLARE: DONTCOPY
(FILEMAP (NIL (307 7337 (ANTILOG 317 . 1152) (ARCSIN 1154 . 2039) (ARCTAN 2041 .
3009) (LOG 3011 . 4177) (SIN 4179 . 5219) (SQRT 5221 . 6096) (TAN 6098 . 6825) (
TANSERIES 6827 . 7335)))))
STOP