1 /* Used by sinf, cosf and sincosf functions.
2 Copyright (C) 2018-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
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/>. */
19 /* The constants and polynomials for sine and cosine. */
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. */
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. */
33 sincosf_poly (double x
, double x2
, const sincos_t
*p
, int n
, float *sinp
,
36 double x3
, x4
, x5
, x6
, s
, c
, c1
, c2
, s1
;
40 c2
= p
->c3
+ x2
* p
->c4
;
41 s1
= p
->s2
+ x2
* p
->s3
;
43 /* Swap sin/cos result based on quadrant. */
44 float *tmp
= (n
& 1 ? cosp
: sinp
);
45 cosp
= (n
& 1 ? sinp
: cosp
);
48 c1
= p
->c0
+ x2
* p
->c1
;
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. */
62 sinf_poly (double x
, double x2
, const sincos_t
*p
, int n
)
64 double x3
, x4
, x6
, x7
, s
, c
, c1
, c2
, s1
;
69 s1
= p
->s2
+ x2
* p
->s3
;
79 c2
= p
->c3
+ x2
* p
->c4
;
80 c1
= p
->c0
+ x2
* p
->c1
;