xref: /aosp_15_r20/external/fdlibm/fdlibm.h (revision 1e651e1ef2b613db2c4b29ae59c1de74cf0222ae)
1*1e651e1eSRoland Levillain 
2*1e651e1eSRoland Levillain /* @(#)fdlibm.h 1.5 04/04/22 */
3*1e651e1eSRoland Levillain /*
4*1e651e1eSRoland Levillain  * ====================================================
5*1e651e1eSRoland Levillain  * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
6*1e651e1eSRoland Levillain  *
7*1e651e1eSRoland Levillain  * Permission to use, copy, modify, and distribute this
8*1e651e1eSRoland Levillain  * software is freely granted, provided that this notice
9*1e651e1eSRoland Levillain  * is preserved.
10*1e651e1eSRoland Levillain  * ====================================================
11*1e651e1eSRoland Levillain  */
12*1e651e1eSRoland Levillain 
13*1e651e1eSRoland Levillain #ifdef __cplusplus
14*1e651e1eSRoland Levillain extern "C" {
15*1e651e1eSRoland Levillain #endif
16*1e651e1eSRoland Levillain 
17*1e651e1eSRoland Levillain #ifndef __LITTLE_ENDIAN
18*1e651e1eSRoland Levillain /* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
19*1e651e1eSRoland Levillain    but these catch some common cases. */
20*1e651e1eSRoland Levillain #if defined(i386) || defined(i486) || \
21*1e651e1eSRoland Levillain 	defined(intel) || defined(x86) || defined(i86pc) || \
22*1e651e1eSRoland Levillain 	defined(__alpha) || defined(__osf__) || defined(__MIPSEL__)
23*1e651e1eSRoland Levillain #define __LITTLE_ENDIAN
24*1e651e1eSRoland Levillain #endif
25*1e651e1eSRoland Levillain #endif
26*1e651e1eSRoland Levillain 
27*1e651e1eSRoland Levillain #ifdef __LITTLE_ENDIAN
28*1e651e1eSRoland Levillain #define __HI(x) *(1+(int*)&x)
29*1e651e1eSRoland Levillain #define __LO(x) *(int*)&x
30*1e651e1eSRoland Levillain #define __HIp(x) *(1+(int*)x)
31*1e651e1eSRoland Levillain #define __LOp(x) *(int*)x
32*1e651e1eSRoland Levillain #else
33*1e651e1eSRoland Levillain #define __HI(x) *(int*)&x
34*1e651e1eSRoland Levillain #define __LO(x) *(1+(int*)&x)
35*1e651e1eSRoland Levillain #define __HIp(x) *(int*)x
36*1e651e1eSRoland Levillain #define __LOp(x) *(1+(int*)x)
37*1e651e1eSRoland Levillain #endif
38*1e651e1eSRoland Levillain 
39*1e651e1eSRoland Levillain #ifndef __P
40*1e651e1eSRoland Levillain #define __FDLIBM_P_DEFINED
41*1e651e1eSRoland Levillain #ifdef __STDC__
42*1e651e1eSRoland Levillain #define	__P(p)	p
43*1e651e1eSRoland Levillain #else
44*1e651e1eSRoland Levillain #define	__P(p)	()
45*1e651e1eSRoland Levillain #endif
46*1e651e1eSRoland Levillain #endif
47*1e651e1eSRoland Levillain 
48*1e651e1eSRoland Levillain /*
49*1e651e1eSRoland Levillain  * ANSI/POSIX
50*1e651e1eSRoland Levillain  */
51*1e651e1eSRoland Levillain 
52*1e651e1eSRoland Levillain extern int signgam;
53*1e651e1eSRoland Levillain 
54*1e651e1eSRoland Levillain #define	MAXFLOAT	((float)3.40282346638528860e+38)
55*1e651e1eSRoland Levillain 
56*1e651e1eSRoland Levillain enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
57*1e651e1eSRoland Levillain 
58*1e651e1eSRoland Levillain #define _LIB_VERSION_TYPE enum fdversion
59*1e651e1eSRoland Levillain #define _LIB_VERSION _fdlib_version
60*1e651e1eSRoland Levillain 
61*1e651e1eSRoland Levillain /* if global variable _LIB_VERSION is not desirable, one may
62*1e651e1eSRoland Levillain  * change the following to be a constant by:
63*1e651e1eSRoland Levillain  *	#define _LIB_VERSION_TYPE const enum version
64*1e651e1eSRoland Levillain  * In that case, after one initializes the value _LIB_VERSION (see
65*1e651e1eSRoland Levillain  * s_lib_version.c) during compile time, it cannot be modified
66*1e651e1eSRoland Levillain  * in the middle of a program
67*1e651e1eSRoland Levillain  */
68*1e651e1eSRoland Levillain extern  _LIB_VERSION_TYPE  _LIB_VERSION;
69*1e651e1eSRoland Levillain 
70*1e651e1eSRoland Levillain #define _IEEE_  fdlibm_ieee
71*1e651e1eSRoland Levillain #define _SVID_  fdlibm_svid
72*1e651e1eSRoland Levillain #define _XOPEN_ fdlibm_xopen
73*1e651e1eSRoland Levillain #define _POSIX_ fdlibm_posix
74*1e651e1eSRoland Levillain 
75*1e651e1eSRoland Levillain struct exception {
76*1e651e1eSRoland Levillain 	int type;
77*1e651e1eSRoland Levillain 	char *name;
78*1e651e1eSRoland Levillain 	double arg1;
79*1e651e1eSRoland Levillain 	double arg2;
80*1e651e1eSRoland Levillain 	double retval;
81*1e651e1eSRoland Levillain };
82*1e651e1eSRoland Levillain 
83*1e651e1eSRoland Levillain #define	HUGE		MAXFLOAT
84*1e651e1eSRoland Levillain 
85*1e651e1eSRoland Levillain /*
86*1e651e1eSRoland Levillain  * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
87*1e651e1eSRoland Levillain  * (one may replace the following line by "#include <values.h>")
88*1e651e1eSRoland Levillain  */
89*1e651e1eSRoland Levillain 
90*1e651e1eSRoland Levillain #define X_TLOSS		1.41484755040568800000e+16
91*1e651e1eSRoland Levillain 
92*1e651e1eSRoland Levillain #define	DOMAIN		1
93*1e651e1eSRoland Levillain #define	SING		2
94*1e651e1eSRoland Levillain #define	OVERFLOW	3
95*1e651e1eSRoland Levillain #define	UNDERFLOW	4
96*1e651e1eSRoland Levillain #define	TLOSS		5
97*1e651e1eSRoland Levillain #define	PLOSS		6
98*1e651e1eSRoland Levillain 
99*1e651e1eSRoland Levillain /*
100*1e651e1eSRoland Levillain  * ANSI/POSIX
101*1e651e1eSRoland Levillain  */
102*1e651e1eSRoland Levillain extern double ieee_acos __P((double));
103*1e651e1eSRoland Levillain extern double ieee_asin __P((double));
104*1e651e1eSRoland Levillain extern double ieee_atan __P((double));
105*1e651e1eSRoland Levillain extern double ieee_atan2 __P((double, double));
106*1e651e1eSRoland Levillain extern double ieee_cos __P((double));
107*1e651e1eSRoland Levillain extern double ieee_sin __P((double));
108*1e651e1eSRoland Levillain extern double ieee_tan __P((double));
109*1e651e1eSRoland Levillain 
110*1e651e1eSRoland Levillain extern double ieee_cosh __P((double));
111*1e651e1eSRoland Levillain extern double ieee_sinh __P((double));
112*1e651e1eSRoland Levillain extern double ieee_tanh __P((double));
113*1e651e1eSRoland Levillain 
114*1e651e1eSRoland Levillain extern double ieee_exp __P((double));
115*1e651e1eSRoland Levillain extern double ieee_frexp __P((double, int *));
116*1e651e1eSRoland Levillain extern double ieee_ldexp __P((double, int));
117*1e651e1eSRoland Levillain extern double ieee_log __P((double));
118*1e651e1eSRoland Levillain extern double ieee_log10 __P((double));
119*1e651e1eSRoland Levillain extern double ieee_modf __P((double, double *));
120*1e651e1eSRoland Levillain 
121*1e651e1eSRoland Levillain extern double ieee_pow __P((double, double));
122*1e651e1eSRoland Levillain extern double ieee_sqrt __P((double));
123*1e651e1eSRoland Levillain 
124*1e651e1eSRoland Levillain extern double ieee_ceil __P((double));
125*1e651e1eSRoland Levillain extern double ieee_fabs __P((double));
126*1e651e1eSRoland Levillain extern double ieee_floor __P((double));
127*1e651e1eSRoland Levillain extern double ieee_fmod __P((double, double));
128*1e651e1eSRoland Levillain 
129*1e651e1eSRoland Levillain extern double ieee_erf __P((double));
130*1e651e1eSRoland Levillain extern double ieee_erfc __P((double));
131*1e651e1eSRoland Levillain extern double ieee_gamma __P((double));
132*1e651e1eSRoland Levillain extern double ieee_hypot __P((double, double));
133*1e651e1eSRoland Levillain extern int ieee_isnan __P((double));
134*1e651e1eSRoland Levillain extern int ieee_finite __P((double));
135*1e651e1eSRoland Levillain extern double ieee_j0 __P((double));
136*1e651e1eSRoland Levillain extern double ieee_j1 __P((double));
137*1e651e1eSRoland Levillain extern double ieee_jn __P((int, double));
138*1e651e1eSRoland Levillain extern double ieee_lgamma __P((double));
139*1e651e1eSRoland Levillain extern double ieee_y0 __P((double));
140*1e651e1eSRoland Levillain extern double ieee_y1 __P((double));
141*1e651e1eSRoland Levillain extern double ieee_yn __P((int, double));
142*1e651e1eSRoland Levillain 
143*1e651e1eSRoland Levillain extern double acosh __P((double));
144*1e651e1eSRoland Levillain extern double asinh __P((double));
145*1e651e1eSRoland Levillain extern double atanh __P((double));
146*1e651e1eSRoland Levillain extern double ieee_cbrt __P((double));
147*1e651e1eSRoland Levillain extern double ieee_logb __P((double));
148*1e651e1eSRoland Levillain extern double ieee_nextafter __P((double, double));
149*1e651e1eSRoland Levillain extern double ieee_remainder __P((double, double));
150*1e651e1eSRoland Levillain #ifdef _SCALB_INT
151*1e651e1eSRoland Levillain extern double ieee_scalb __P((double, int));
152*1e651e1eSRoland Levillain #else
153*1e651e1eSRoland Levillain extern double ieee_scalb __P((double, double));
154*1e651e1eSRoland Levillain #endif
155*1e651e1eSRoland Levillain 
156*1e651e1eSRoland Levillain extern int ieee_matherr __P((struct exception *));
157*1e651e1eSRoland Levillain 
158*1e651e1eSRoland Levillain /*
159*1e651e1eSRoland Levillain  * IEEE Test Vector
160*1e651e1eSRoland Levillain  */
161*1e651e1eSRoland Levillain extern double ieee_significand __P((double));
162*1e651e1eSRoland Levillain 
163*1e651e1eSRoland Levillain /*
164*1e651e1eSRoland Levillain  * Functions callable from C, intended to support IEEE arithmetic.
165*1e651e1eSRoland Levillain  */
166*1e651e1eSRoland Levillain extern double ieee_copysign __P((double, double));
167*1e651e1eSRoland Levillain extern int ieee_ilogb __P((double));
168*1e651e1eSRoland Levillain extern double ieee_rint __P((double));
169*1e651e1eSRoland Levillain extern double ieee_scalbn __P((double, int));
170*1e651e1eSRoland Levillain 
171*1e651e1eSRoland Levillain /*
172*1e651e1eSRoland Levillain  * BSD math library entry points
173*1e651e1eSRoland Levillain  */
174*1e651e1eSRoland Levillain extern double ieee_expm1 __P((double));
175*1e651e1eSRoland Levillain extern double ieee_log1p __P((double));
176*1e651e1eSRoland Levillain 
177*1e651e1eSRoland Levillain /*
178*1e651e1eSRoland Levillain  * Reentrant version of gamma & lgamma; passes signgam back by reference
179*1e651e1eSRoland Levillain  * as the second argument; user must allocate space for signgam.
180*1e651e1eSRoland Levillain  */
181*1e651e1eSRoland Levillain #ifdef _REENTRANT
182*1e651e1eSRoland Levillain extern double ieee_gamma_r __P((double, int *));
183*1e651e1eSRoland Levillain extern double ieee_lgamma_r __P((double, int *));
184*1e651e1eSRoland Levillain #endif	/* _REENTRANT */
185*1e651e1eSRoland Levillain 
186*1e651e1eSRoland Levillain /* ieee style elementary functions */
187*1e651e1eSRoland Levillain extern double __ieee754_sqrt __P((double));
188*1e651e1eSRoland Levillain extern double __ieee754_acos __P((double));
189*1e651e1eSRoland Levillain extern double __ieee754_acosh __P((double));
190*1e651e1eSRoland Levillain extern double __ieee754_log __P((double));
191*1e651e1eSRoland Levillain extern double __ieee754_atanh __P((double));
192*1e651e1eSRoland Levillain extern double __ieee754_asin __P((double));
193*1e651e1eSRoland Levillain extern double __ieee754_atan2 __P((double,double));
194*1e651e1eSRoland Levillain extern double __ieee754_exp __P((double));
195*1e651e1eSRoland Levillain extern double __ieee754_cosh __P((double));
196*1e651e1eSRoland Levillain extern double __ieee754_fmod __P((double,double));
197*1e651e1eSRoland Levillain extern double __ieee754_pow __P((double,double));
198*1e651e1eSRoland Levillain extern double __ieee754_lgamma_r __P((double,int *));
199*1e651e1eSRoland Levillain extern double __ieee754_gamma_r __P((double,int *));
200*1e651e1eSRoland Levillain extern double __ieee754_lgamma __P((double));
201*1e651e1eSRoland Levillain extern double __ieee754_gamma __P((double));
202*1e651e1eSRoland Levillain extern double __ieee754_log10 __P((double));
203*1e651e1eSRoland Levillain extern double __ieee754_sinh __P((double));
204*1e651e1eSRoland Levillain extern double __ieee754_hypot __P((double,double));
205*1e651e1eSRoland Levillain extern double __ieee754_j0 __P((double));
206*1e651e1eSRoland Levillain extern double __ieee754_j1 __P((double));
207*1e651e1eSRoland Levillain extern double __ieee754_y0 __P((double));
208*1e651e1eSRoland Levillain extern double __ieee754_y1 __P((double));
209*1e651e1eSRoland Levillain extern double __ieee754_jn __P((int,double));
210*1e651e1eSRoland Levillain extern double __ieee754_yn __P((int,double));
211*1e651e1eSRoland Levillain extern double __ieee754_remainder __P((double,double));
212*1e651e1eSRoland Levillain extern int    __ieee754_rem_pio2 __P((double,double*));
213*1e651e1eSRoland Levillain #ifdef _SCALB_INT
214*1e651e1eSRoland Levillain extern double __ieee754_scalb __P((double,int));
215*1e651e1eSRoland Levillain #else
216*1e651e1eSRoland Levillain extern double __ieee754_scalb __P((double,double));
217*1e651e1eSRoland Levillain #endif
218*1e651e1eSRoland Levillain 
219*1e651e1eSRoland Levillain /* fdlibm kernel function */
220*1e651e1eSRoland Levillain extern double __kernel_standard __P((double,double,int));
221*1e651e1eSRoland Levillain extern double __kernel_sin __P((double,double,int));
222*1e651e1eSRoland Levillain extern double __kernel_cos __P((double,double));
223*1e651e1eSRoland Levillain extern double __kernel_tan __P((double,double,int));
224*1e651e1eSRoland Levillain extern int    __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*));
225*1e651e1eSRoland Levillain 
226*1e651e1eSRoland Levillain #ifdef __FDLIBM_P_DEFINED
227*1e651e1eSRoland Levillain #undef __P
228*1e651e1eSRoland Levillain #endif
229*1e651e1eSRoland Levillain 
230*1e651e1eSRoland Levillain #ifdef __cplusplus
231*1e651e1eSRoland Levillain }; /* extern "C" */
232*1e651e1eSRoland Levillain #endif
233