|
| ssin.sa 3.3 7/29/91
|
| The entry point sSIN computes the sine of an input argument
| sCOS computes the cosine, and sSINCOS computes both. The
| corresponding entry points with a "d" computes the same
| corresponding function values for denormalized inputs.
|
| Input: Double-extended number X in location pointed to
| by address register a0.
|
| Output: The function value sin(X) or cos(X) returned in Fp0 if SIN or
| COS is requested. Otherwise, for SINCOS, sin(X) is returned
| in Fp0, and cos(X) is returned in Fp1.
|
| Modifies: Fp0 for SIN or COS; both Fp0 and Fp1 for SINCOS.
|
| Accuracy and Monotonicity: The returned result is within 1 ulp in
| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
| result is subsequently rounded to double precision. The
| result is provably monotonic in double precision.
|
| Speed: The programs sSIN and sCOS take approximately 150 cycles for
| input argument X such that |X| < 15Pi, which is the usual
| situation. The speed for sSINCOS is approximately 190 cycles.
|
| Algorithm:
|
| SIN and COS:
| 1. If SIN is invoked, set AdjN := 0; otherwise, set AdjN := 1.
|
| 2. If |X| >= 15Pi or |X| < 2**(-40), go to 7.
|
| 3. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
| k = N mod 4, so in particular, k = 0,1,2,or 3. Overwrite
| k by k := k + AdjN.
|
| 4. If k is even, go to 6.
|
| 5. (k is odd) Set j := (k-1)/2, sgn := (-1)**j. Return sgn*cos(r)
| where cos(r) is approximated by an even polynomial in r,
| 1 + r*r*(B1+s*(B2+ ... + s*B8)), s = r*r.
| Exit.
|
| 6. (k is even) Set j := k/2, sgn := (-1)**j. Return sgn*sin(r)
| where sin(r) is approximated by an odd polynomial in r
| r + r*s*(A1+s*(A2+ ... + s*A7)), s = r*r.
| Exit.
|
| 7. If |X| > 1, go to 9.
|
| 8. (|X|<2**(-40)) If SIN is invoked, return X; otherwise return 1.
|
| 9. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 3.
|
| SINCOS:
| 1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.
|
| 2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
| k = N mod 4, so in particular, k = 0,1,2,or 3.
|
| 3. If k is even, go to 5.
|
| 4. (k is odd) Set j1 := (k-1)/2, j2 := j1 (EOR) (k mod 2), i.e.
| j1 exclusive or with the l.s.b. of k.
| sgn1 := (-1)**j1, sgn2 := (-1)**j2.
| SIN(X) = sgn1 * cos(r) and COS(X) = sgn2*sin(r) where
| sin(r) and cos(r) are computed as odd and even polynomials
| in r, respectively. Exit
|
| 5. (k is even) Set j1 := k/2, sgn1 := (-1)**j1.
| SIN(X) = sgn1 * sin(r) and COS(X) = sgn1*cos(r) where
| sin(r) and cos(r) are