Warning: This file is not a C or C++ file. It does not have highlighting.

1/* Used by sinf, cosf and sincosf functions.
2 Copyright (C) 2018-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* The constants and polynomials for sine and cosine. */
20typedef struct
21{
22 double sign[4]; /* Sign of sine in quadrants 0..3. */
23 double hpi_inv; /* 2 / PI ( * 2^24 if !TOINT_INTRINSICS). */
24 double hpi; /* PI / 2. */
25 double c0, c1, c2, c3, c4; /* Cosine polynomial. */
26 double s1, s2, s3; /* Sine polynomial. */
27} sincos_t;
28
29/* Compute the sine and cosine of inputs X and X2 (X squared), using the
30 polynomial P and store the results in SINP and COSP. N is the quadrant,
31 if odd the cosine and sine polynomials are swapped. */
32static inline void
33sincosf_poly (double x, double x2, const sincos_t *p, int n, float *sinp,
34 float *cosp)
35{
36 double x3, x4, x5, x6, s, c, c1, c2, s1;
37
38 x4 = x2 * x2;
39 x3 = x2 * x;
40 c2 = p->c3 + x2 * p->c4;
41 s1 = p->s2 + x2 * p->s3;
42
43 /* Swap sin/cos result based on quadrant. */
44 float *tmp = (n & 1 ? cosp : sinp);
45 cosp = (n & 1 ? sinp : cosp);
46 sinp = tmp;
47
48 c1 = p->c0 + x2 * p->c1;
49 x5 = x3 * x2;
50 x6 = x4 * x2;
51
52 s = x + x3 * p->s1;
53 c = c1 + x4 * p->c2;
54
55 *sinp = s + x5 * s1;
56 *cosp = c + x6 * c2;
57}
58
59/* Return the sine of inputs X and X2 (X squared) using the polynomial P.
60 N is the quadrant, and if odd the cosine polynomial is used. */
61static inline float
62sinf_poly (double x, double x2, const sincos_t *p, int n)
63{
64 double x3, x4, x6, x7, s, c, c1, c2, s1;
65
66 if ((n & 1) == 0)
67 {
68 x3 = x * x2;
69 s1 = p->s2 + x2 * p->s3;
70
71 x7 = x3 * x2;
72 s = x + x3 * p->s1;
73
74 return s + x7 * s1;
75 }
76 else
77 {
78 x4 = x2 * x2;
79 c2 = p->c3 + x2 * p->c4;
80 c1 = p->c0 + x2 * p->c1;
81
82 x6 = x4 * x2;
83 c = c1 + x4 * p->c2;
84
85 return c + x6 * c2;
86 }
87}
88

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of glibc/sysdeps/ieee754/flt-32/sincosf_poly.h