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 ".SNCS" - SINGLE PRECISION TRIGONOMETRIC SINE, COSINE. NAM .SNCS,6 24998-1X159 REV.2001 780424 * ENT SIN,COS EXT .ZPRV,.CMRS,..FCM * A EQU 0 B EQU 1 * * .SNCS TAKES THE SINGLE-PRECISION SINE OR COSINE OF A * SINGLE-PRECISION ARGUMENT. * * CALLING SEQUENCE: * * DLD * JSB "SIN" OR "COS" * (A,B) = ASCII "05OR" * (A,B) = RESULT * * THE ERROR RETURN IS TAKEN FOR ARGUMENTS OUTSIDE THE RANGE * [-32768*PI/4,+32768*PI/4). * * METHOD: THE ARGUMENT IS REDUCED TO THE RANGE [-PI/4,PI/4] * USING THE IDENTIES: * SIN(X)=SIN(X-2*K*PI) * COS(X)=COS(X-2*K*PI) * SIN(X)=-SIN(X-PI) * COS(X)=-COS(X-PI) * SIN(X)=COS(X-PI/2) * COS(X)=SIN(X+PI/2) * THIS IS DONE BY SUBTRACTING THE MULTIPLE (N) OF PI/2 WHICH * MINIMIZES THE RESULT, AND OBSERVING THE FOLLOWING: * 1) ALL BITS ABOVE BIT 1 IN N MAY BE IGNORED, SINCE THESE ARE * MULTIPLES OF 4, OR MULTIPLES OF 2*PI SUBTRACTED. * 2) IF BIT 1 IS SET, THE RESULT SHOULD BE NEGATED, SINCE PI WAS * SUBTRACTED. * 3) IF BIT 0 IS SET, THE COSINE SERIES SHOULD BE USED, SINCE PI/2 * WAS SUBTRACTED. * THE COSINE ENTRY POINT EFFECTIVELY ADDS PI/2 TO THE ARGUMENT BY * ADDING 1 TO N JUST AFTER THE REDUCTION. * * THE FOLLOWING APPROXIMATIONS ARE USED IN THE RANGE [-PI/4,+PI/4] . * * SINE(X) = X*(S1+XSQ*(S2+XSQ*(S3+XSQ*S4))) * COSINE(Y) = C1+YSQ*(C2+YSQ*(C3+YSQ*C4)) * WHERE: * XSQ = X**2 YSQ = Y**2 * S1 = .78539816 C1 = 1.0 * S2 = -.0807454325 C2 = -.30842483 * S3 = .002490001 C3 = .015851077 * S4 = -.000035950439 C4 = -.00031957 SKP * RANGE REDUCE, SET SIGN FLAG, CHOOSE WHICH SERIES. * SIN NOP JSB .ZPRV FOR SHARING. DEF LIBX STA Y CLA J=0 SIN1 STA J LDA Y REDUCE ARG JSB .CMRS DEF .4PI DEF N JMP ERROR IF WAS TOO BIG ISZ SIN GOOD RETURN STA Y SAVE Y = REDUCED X STB Y+1 FMP Y Y**2 STA YSQ STB YSQ+1 LDA N 2*(NUMBER OF PI/2 SUBTRACTED) ADA J 0 FOR SIN, 2 FOR COS ERA,ERA E=1 IFF ODD NUMBER OF PI/2 (USE COSINE) IOR =B177776 A=-1 IFF ODD NUMBER OF PI (NEGATE RESULT) STA N DONE NOW SO DON'T HAVE TO STORE RESULT LDA YSQ NOW (A,B) = Y**2 SEZ SINE ? JMP SIN2 NO, USE COSINE SERIES * * USE SINE SERIES * FMP S4 FORM Y*(S1+YSQ*(S2+YSQ*(S3+YSQ*S4))) FAD S3 FMP YSQ FAD S2 FMP YSQ FAD S1 FMP Y RESULT JMP SIN3 GO ATTACH SIGN SKP * USE COSINE SERIES * SIN2 FMP C4 FORM C1+YSQ*(C2+YSQ*(C3+YSQ*C4)) FAD C3 FMP YSQ FAD C2 FMP YSQ FAD C1 * * NEGATE IF ODD NUMBER OF PI * SIN3 ISZ N NEGATE ? JMP LIBX NO, EXIT JSB ..FCM NEGATE LIBX JMP SIN,I EXIT DEF SIN * * ERROR PROCESSING * ERROR LDA =A05 RETURN (A,B) = ASCII "05OR" LDB =AOR JMP LIBX * * COSINE ENTRY POINT. * COS NOP JSB .ZPRV FOR SHARING. DEF LIBX2 FAKE EXIT STA Y LDA COS COPY ENTRY POINT STA SIN LDA =D2 J=2 JMP SIN1 LIBX2 JMP SIN,I FAKE EXIT. ORG *-1 SKP * LOCALS & CONSTANTS * Y BSS 2 REDUCED ARG YSQ BSS 2 Y**2 .4PI OCT 050574,140667,023402 4/PI N BSS 1 2*(NUMBER OF PI/2 SUBTRACTED) J BSS 1 0 FOR SIN, 2 FOR COS S1 DEC .78539816 S2 DEC -.0807454325 S3 DEC .002490001 S4 DEC -.000035950439 C1 DEC 1.0 C2 DEC -.30842483 C3 DEC .015851077 C4 DEC -.00031957 END