2 * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 #define BIAS (LDBL_MAX_EXP - 1)
34 #define MANH_SIZE LDBL_MANH_SIZE
36 /* Approximation thresholds. */
37 #define ASIN_LINEAR (BIAS - 32) /* 2**-32 */
38 #define ACOS_CONST (BIAS - 65) /* 2**-65 */
39 #define ATAN_CONST (BIAS + 65) /* 2**65 */
40 #define ATAN_LINEAR (BIAS - 32) /* 2**-32 */
43 #define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
45 /* Constants shared by the long double inverse trig functions. */
58 #define atanhi _ItL_atanhi
59 #define atanlo _ItL_atanlo
61 #define pi_lo _ItL_pi_lo
63 #define pio2_hi atanhi[3]
64 #define pio2_lo atanlo[3]
65 #define pio4_hi atanhi[1]
68 typedef struct longdouble
{
73 typedef long double LONGDOUBLE
;
76 extern const LONGDOUBLE pS0
, pS1
, pS2
, pS3
, pS4
, pS5
, pS6
;
77 extern const LONGDOUBLE qS1
, qS2
, qS3
, qS4
, qS5
;
78 extern const LONGDOUBLE atanhi
[], atanlo
[], aT
[];
79 extern const LONGDOUBLE pi_lo
;
83 static inline long double
87 return (x
* (pS0
+ x
* (pS1
+ x
* (pS2
+ x
* (pS3
+ x
* \
88 (pS4
+ x
* (pS5
+ x
* pS6
)))))));
91 static inline long double
95 return (1.0 + x
* (qS1
+ x
* (qS2
+ x
* (qS3
+ x
* (qS4
+ x
* qS5
)))));
98 static inline long double
102 return (aT
[0] + x
* (aT
[2] + x
* (aT
[4] + x
* (aT
[6] + x
* \
103 (aT
[8] + x
* (aT
[10] + x
* aT
[12]))))));
106 static inline long double
110 return (aT
[1] + x
* (aT
[3] + x
* (aT
[5] + x
* (aT
[7] + x
* \
111 (aT
[9] + x
* aT
[11])))));