2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 #include "../ld/fpmath.h"
35 #define BIAS (LDBL_MAX_EXP - 1)
36 #define MANH_SIZE (LDBL_MANH_SIZE + 1)
38 /* Approximation thresholds. */
39 #define ASIN_LINEAR (BIAS - 56) /* 2**-56 */
40 #define ACOS_CONST (BIAS - 113) /* 2**-113 */
41 #define ATAN_CONST (BIAS + 113) /* 2**113 */
42 #define ATAN_LINEAR (BIAS - 56) /* 2**-56 */
45 #define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
47 /* Constants shared by the long double inverse trig functions. */
67 #define atanhi _ItL_atanhi
68 #define atanlo _ItL_atanlo
70 #define pi_lo _ItL_pi_lo
72 #define pio2_hi atanhi[3]
73 #define pio2_lo atanlo[3]
74 #define pio4_hi atanhi[1]
76 /* Constants shared by the long double inverse trig functions. */
77 extern const long double pS0
, pS1
, pS2
, pS3
, pS4
, pS5
, pS6
, pS7
, pS8
, pS9
;
78 extern const long double qS1
, qS2
, qS3
, qS4
, qS5
, qS6
, qS7
, qS8
, qS9
;
79 extern const long double atanhi
[], atanlo
[], aT
[];
80 extern const long double pi_lo
;
82 static inline long double
86 return (x
* (pS0
+ x
* (pS1
+ x
* (pS2
+ x
* (pS3
+ x
* \
87 (pS4
+ x
* (pS5
+ x
* (pS6
+ x
* (pS7
+ x
* (pS8
+ x
* \
91 static inline long double
95 return (1.0 + x
* (qS1
+ x
* (qS2
+ x
* (qS3
+ x
* (qS4
+ x
* \
96 (qS5
+ x
* (qS6
+ x
* (qS7
+ x
* (qS8
+ x
* qS9
)))))))));
99 static inline long double
100 T_even(long double x
)
103 return (aT
[0] + x
* (aT
[2] + x
* (aT
[4] + x
* (aT
[6] + x
* \
104 (aT
[8] + x
* (aT
[10] + x
* (aT
[12] + x
* (aT
[14] + x
* \
105 (aT
[16] + x
* (aT
[18] + x
* (aT
[20] + x
* aT
[22])))))))))));
108 static inline long double
112 return (aT
[1] + x
* (aT
[3] + x
* (aT
[5] + x
* (aT
[7] + x
* \
113 (aT
[9] + x
* (aT
[11] + x
* (aT
[13] + x
* (aT
[15] + x
* \
114 (aT
[17] + x
* (aT
[19] + x
* (aT
[21] + x
* aT
[23])))))))))));