ASMB,L,R,C * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * **************************************************************** * * NAME: PART OF MATH LIBRARY * SOURCE: 24998-18XXX SEE NAM FOR LAST THREE DIGITS * RELOC: PART OF 24998-12001 * PGMR: BG & JTS * HED ".TAN" - TRIPLE PRECISION TRIGONOMETRIC TANGENT. NAM .TAN,7 24998-1X129 REV.2001 790417 * ENT .TAN EXT .ENTR,/CMRT,DPOLY,.TDIV * * .TAN TAKES THE TRIPLE-PRECISION TANGENT OF A * TRIPLE-PRECISION NUMBER. * * CALLING SEQUENCE: * * JSB .TAN * DEF *+3 * DEF * DEF * (A,B) = ASCII "09OR" * * * THE ERROR RETURN IS TAKEN IF THE ARGUMENT IS OUTSIDE * THE RANGE [-2**23,+2**23) . * * METHOD: THE ROUTINE ".CMRT" IS USED TO SUBTRACT N*PI/2 FROM * THE ARGUMENT AND MULTIPLY BY 4/PI, WHERE N IS CHOSEN S.T. * THE RESULT IS IN [-1,+1] . THE LOWEST BIT OF N (EVEN/ODD) * IS ALSO RETURNED. * THE TANGENT IS THEN EVALUATED ON THIS REDUCED INTERVAL, AND * THE RESULT IS INVERTED AND NEGATED IF N WAS ODD. SEE "TAN". * * THE APPROXIMATION USED FOR TANGENT ON [-1,+1] IS: * * C1+YSQ*(C2+YSQ*(C3+YSQ*C4)) * TANGENT(Y*4/PI) = Y * ----------------------------- * C5+YSQ*(C6+YSQ*(C7+YSQ)) * * WHERE: * C1 = -.160528895723771175D+5 * C2 = +.127029221227298238D+4 * C3 = -.171390807007805963D+2 * C4 = +.281970876313544687D-1 * C5 = -.204391738108172811D+5 * C6 = +.582002294049071829D+4 * C7 = -.181557373390721805D+3 * * NOTE ON SPEED: IF DPOLY WERE NOT USED, IT WOULD BE POSSIBLE TO * AVOID THE INVERSION STEP BY REVERSING THE ORDER OF THE ABOVE * DIVIDE. THIS WOULD REQUIRE TWO CALLS TO DPOLY (ONE FOR THE * NUMERATOR AND ONE FOR THE DENOMINATOR) AND A DIVIDE, WHICH WOULD * TAKE AS MUCH ADDITIONAL TIME AS THE EXTRA DIVIDE NOW TAKES. SKP * RANGE REDUCE. * RESLT DEF *-* ARG DEF *-* .TAN NOP JSB .ENTR COPY ADDRESSES DEF RESLT CLA "TAN" FLAG TO /CMRT JSB /CMRT REDUCE DEF X DEF C DEF ARG,I JMP ERROR TOO BIG. STB N SAVE EVEN/ODD FLAG ISZ .TAN SET NORMAL RETURN * * EVALUATE APPROXIMATION * JSB DPOLY OCT 100000 FLAGS DEF RESLT,I DEF X DEF C4 CONSTANTS DEF THREE ORDER OF NUMERATOR DEF THREE ORDER OF DENOMINATOR LDA N ODD # OF PI/2 ? RAR,SLA JMP *+2 JMP .TAN,I NO, EXIT. JSB .TDIV YES, TAKE -1.0 / RESULT DEF RESLT,I DEF MONE DEF RESLT,I JMP .TAN,I EXIT * * ERROR PROCESSING * ERROR LDA =A09 (A,B) = ASCII "09OR" LDB =AOR JMP .TAN,I SKP * LOCALS & CONSTANTS * X BSS 4 REDUCED ARG N BSS 1 EVEN/ODD FLAG THREE DEC 3 INTEGER 3 MONE OCT 100000,0,0,0 4-WD -1.0 C OCT 050574,140667,023442,005402 4/PI FIRST 55 BITS CL OCT 071162,020251,047741,035713 4/PI AFTER 1ST 28 BITS C4 OCT 071576,145023,100575,032767 C3 OCT 135561,112324,025222,000012 C2 OCT 047544,126346,143277,030026 C1 OCT 101226,034211,174051,133034 C7 OCT 122470,123775,016630,034020 C6 OCT 055360,013575,133105,107432 C5 OCT 130050,151601,021140,013036 END