( FILE: TRANSCEN2 -- 8 July 88 -- MFB ) ( ****************************************************** * T R A N S C E N D E N T A L F U N C T I O N S * ****************************************************** This file contains the common transcendental functions for floating point. The algorithms are based on those described in the Am9511A/Am9512 Floating Point Processor Manual by Steven Cheng, published by Advanced Micro Devices. The functions are: PI (-- fpn) constant PI PI/2 (-- fpn) constant PI over 2 SIN (fpn1 -- fpn2) sine (input is in radians) COS (fpn1 -- fpn2) cosine TAN (fpn1 -- fpn2) tangent ASIN (fpn1 -- fpn2) Inverse sine (output is in radians) ACOS (fpn1 -- fpn2) Inverse cosine ATAN (fpn1 -- fpn2) Inverse tangent LN (fpn1 -- fpn2) Natural logarithm EXP (fpn1 -- fpn2) Exponentiation (e to power of fpn1) LOG (fpn1 -- fpn2) Base 10 logarithm PWR (fpn1 fpn2 -- fpn3) Fpn1 to the power of fpn2 SQRT (fpn1 -- fpn2) Square Root D>R (fpn1 -- fpn2) Convert degrees to radians R>D (fpn1 -- fpn2) Convert radians to degrees In the above, "fpn" refers to floating point numbers on the stack (actually 2 16 bit stack entries). Currently, the functions do not check for invalid range of input. The input checking that could be added if desired is: LN, EXP, and SQRT: input < 0.0 ASIN and ACOS: abs(input) > 1.0 ) 3.1415926 ,CONST PI 1.5707963 ,CONST PI/2 ( word to evaluate chebychev poly. series: num+1 terms) : CHEBY ( xhi xlo ctabadr num -- chxhi chxlo) ,SWAP 2. F* 4 PICK ,@ 0. 0. 9 PICK 1 DO ,DROP ,OVER ,SWAP ,OVER 10 PICK 10 PICK F* ,OVER F- 12 PICK 4 + DUP 13 POKE ,@ F+ 6 POKE 6 POKE LOOP ,SWAP ,DROP F- 2. F/ ,SWAP ,DROP ,SWAP ,DROP ; ( round to nearest integer of lower value) : ENTIER ( xhi xlo -- entxhi entxlo ) ,DUP 0. F< IF 1. F- THEN INTEGER FLOAT ; DATA[ -6.702792E-09 ( table of Chebychev cooefficients for ) 1.184962E-06 ( sine series) -1.365875E-04 9.118016E-03 -0.2852616 2.552558 ] COEFSIN ( eval sin with X*CHEBY(2X**2-1.0) after range reducing input to -pi/2 <= X <= pi/2) : SIN PI/2 F/ ,DUP 1. F+ 4. F/ ENTIER 4. F* F- ,DUP 1. F> IF 2. ,SWAP F- THEN ,DUP ,DUP F* 2. F* 1. F- COEFSIN 5 CHEBY F* ; : COS PI/2 F+ SIN ; DATA[ 1.0380510E-09 1.4458187E-08 2.0137658E-07 2.8048161E-06 3.9066370E-05 5.4417038E-04 7.5861016E-03 1.0675393E-01 1.7701474 ] COEFTAN ( eval tanx = X * CHEBY(2X**2-1.0) after range reduce to -pi/4 <= x <= pi/4 then if input was > than pi/4 then tanx = 1/tanx ) : TAN PI/2 F/ 2. F* ,DUP 1. F+ 4. F/ ENTIER 4. F* F- ,DUP 1. F> DOUBLE ,SWAP ,OVER SINGLE IF 2. ,SWAP F- THEN ,DUP ,DUP F* 2. F* 1. F- COEFTAN 8 CHEBY F* ,SWAP SINGLE IF 1. ,SWAP F/ THEN ; : D>R 57.295779 F/ ; : R>D 57.295779 F* ; DATA[ -1.3215160E-09 5.3411877E-08 -1.8506907E-06 5.3453058E-05 -1.2357141E-03 2.1446556E-02 -2.4876243E-01 1.4569999 ] COEFEXP : EXP 1.4426950 ( log2(e)) F* ,DUP ENTIER 1. F+ ,SWAP ,OVER ,SWAP F- 2. F* 1. F- COEFEXP 7 CHEBY ,SWAP INTEGER SINGLE 127 + 255 AND 80H * 0 ( 2**N) F* ; DATA[ -4.4209570E-09 2.8630251E-08 -1.8772800E-07 1.2504674E-06 -8.5029675E-06 5.9470712E-05 -4.3327589E-04 3.3670893E-03 -2.9437253E-02 3.4314575E-01 7.5290563E-01 ] COEFLN : LN FABS OVER 7F80H AND 128 / 127 - DOUBLE FLOAT 0.69314718 ( ln(2)) F* ,SWAP SWAP 3F7FH AND 3F00H OR SWAP 4. F* 3. F- COEFLN 10 CHEBY F+ ; : LOG LN .4342945 F* ; : PWR ( valhi vallo exphi explo -- v**ehi v**elo ) ,SWAP LN F* EXP ; : SQRT FABS ,DUP OR IF OVER 7F80H AND 128 / 126 - DUP 1 AND IF 1+ THEN 40H * 3F80H + 0 ,SWAP SWAP DUP 80H AND IF 3E80H ELSE 3F00H THEN SWAP 7FH AND OR SWAP ,DUP .68629150 F* .34314575 F+ 3 1 DO ,OVER ,OVER F/ F+ 2. F/ LOOP ,SWAP ,DROP F* THEN ; DATA[ 1.5421800E-09 1.0671938E-08 7.5500784E-08 5.4965045E-07 4.1584779E-06 3.3223672E-05 2.8842183E-04 2.8854414E-03 3.8854414E-02 1.4866665 ] COEFASIN : ASIN ,DUP ,DUP F* ,DUP .5 F> IF 3. ,OVER 4. F* F- COEFASIN 9 CHEBY ,SWAP -2. F* 2. F+ SQRT F* PI/2 ,SWAP F- ,SWAP DROP 0 < IF F-1* THEN ELSE 4. F* 1. F- COEFASIN 9 CHEBY F* 1.4142135 F* THEN ; : ACOS ASIN PI/2 ,SWAP F- ; DATA[ -3.2448600E-10 2.0685060E-09 -1.3303384E-08 8.6488779E-08 -5.6991862E-07 3.8210366E-06 -2.6215196E-05 1.8574297E-04 -1.3811950E-03 1.1135842E-02 -1.0589292E-01 1.7627472 ] COEFATAN : ATAN ,DUP FABS 1. F> DOUBLE ,SWAP ,OVER SINGLE IF 1. ,SWAP F/ THEN ,DUP ,DUP F* 2. F* 1. F- COEFATAN 11 CHEBY F* ,SWAP SINGLE IF PI/2 4 PICK 0 < IF F-1* THEN ,SWAP F- THEN ;