2 /* @(#)fdlibm.h 1.5 04/04/22 */
4 * ====================================================
5 * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
7 * Permission to use, copy, modify, and distribute this
8 * software is freely granted, provided that this notice
10 * ====================================================
13 #ifndef __CLASSPATH_FDLIBM_H__
14 #define __CLASSPATH_FDLIBM_H__
16 /* AIX needs _XOPEN_SOURCE */
24 /* GCJ LOCAL: Include files. */
26 /* CLASSPATH LOCAL: */
27 /* #include "namespace.h" */
31 /* CYGNUS LOCAL: Default to XOPEN_MODE. */
38 /* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
39 but these catch some common cases. */
42 #if defined(i386) || defined(i486) || \
43 defined(intel) || defined(x86) || defined(i86pc) || \
44 defined(__alpha) || defined(__osf__)
45 #define __LITTLE_ENDIAN
48 #ifdef __LITTLE_ENDIAN
49 #define __HI(x) *(1+(int*)&x)
50 #define __LO(x) *(int*)&x
51 #define __HIp(x) *(1+(int*)x)
52 #define __LOp(x) *(int*)x
54 #define __HI(x) *(int*)&x
55 #define __LO(x) *(1+(int*)&x)
56 #define __HIp(x) *(int*)x
57 #define __LOp(x) *(1+(int*)x)
74 #define MAXFLOAT ((float)3.40282346638528860e+38)
77 enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
79 #define _LIB_VERSION_TYPE enum fdversion
80 #define _LIB_VERSION _fdlib_version
82 /* if global variable _LIB_VERSION is not desirable, one may
83 * change the following to be a constant by:
84 * #define _LIB_VERSION_TYPE const enum version
85 * In that case, after one initializes the value _LIB_VERSION (see
86 * s_lib_version.c) during compile time, it cannot be modified
87 * in the middle of a program
89 extern _LIB_VERSION_TYPE _LIB_VERSION;
91 #define _IEEE_ fdlibm_ieee
92 #define _SVID_ fdlibm_svid
93 #define _XOPEN_ fdlibm_xopen
94 #define _POSIX_ fdlibm_posix
96 /* struct exception { */
104 #define HUGE MAXFLOAT
107 * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
108 * (one may replace the following line by "#include <values.h>")
111 #define X_TLOSS 1.41484755040568800000e+16
120 /* These typedefs are true for the targets running Java. */
131 extern double acos __P((double));
132 extern double asin __P((double));
133 extern double atan __P((double));
134 extern double atan2 __P((double, double));
135 extern double cos __P((double));
136 extern double sin __P((double));
137 extern double tan __P((double));
139 extern double cosh __P((double));
140 extern double sinh __P((double));
141 extern double tanh __P((double));
143 extern double exp __P((double));
144 extern double frexp __P((double, int *));
145 extern double ldexp __P((double, int));
146 extern double log __P((double));
147 extern double log10 __P((double));
148 extern double modf __P((double, double *));
150 extern double pow __P((double, double));
151 extern double sqrt __P((double));
153 extern double ceil __P((double));
154 extern double fabs __P((double));
155 extern double floor __P((double));
156 extern double fmod __P((double, double));
158 extern double erf __P((double));
159 extern double erfc __P((double));
160 extern double gamma __P((double));
161 extern double hypot __P((double, double));
164 #define isnan(x) ((x) != (x))
167 extern int finite __P((double));
168 extern double j0 __P((double));
169 extern double j1 __P((double));
170 extern double jn __P((int, double));
171 extern double lgamma __P((double));
172 extern double y0 __P((double));
173 extern double y1 __P((double));
174 extern double yn __P((int, double));
176 extern double acosh __P((double));
177 extern double asinh __P((double));
178 extern double atanh __P((double));
179 extern double cbrt __P((double));
180 extern double logb __P((double));
181 extern double nextafter __P((double, double));
182 extern double remainder __P((double, double));
184 extern double scalb __P((double, int));
186 extern double scalb __P((double, double));
189 /* extern int matherr __P((struct exception *)); */
194 extern double significand __P((double));
197 * Functions callable from C, intended to support IEEE arithmetic.
199 extern double copysign __P((double, double));
200 extern int ilogb __P((double));
201 extern double rint __P((double));
202 extern double scalbn __P((double, int));
205 * BSD math library entry points
207 extern double expm1 __P((double));
208 extern double log1p __P((double));
211 * Reentrant version of gamma & lgamma; passes signgam back by reference
212 * as the second argument; user must allocate space for signgam.
215 extern double gamma_r __P((double, int *));
216 extern double lgamma_r __P((double, int *));
217 #endif /* _REENTRANT */
219 /* ieee style elementary functions */
220 extern double __ieee754_sqrt __P((double));
221 extern double __ieee754_acos __P((double));
222 extern double __ieee754_acosh __P((double));
223 extern double __ieee754_log __P((double));
224 extern double __ieee754_atanh __P((double));
225 extern double __ieee754_asin __P((double));
226 extern double __ieee754_atan2 __P((double,double));
227 extern double __ieee754_exp __P((double));
228 extern double __ieee754_cosh __P((double));
229 extern double __ieee754_fmod __P((double,double));
230 extern double __ieee754_pow __P((double,double));
231 extern double __ieee754_lgamma_r __P((double,int *));
232 extern double __ieee754_gamma_r __P((double,int *));
233 extern double __ieee754_lgamma __P((double));
234 extern double __ieee754_gamma __P((double));
235 extern double __ieee754_log10 __P((double));
236 extern double __ieee754_sinh __P((double));
237 extern double __ieee754_hypot __P((double,double));
238 extern double __ieee754_j0 __P((double));
239 extern double __ieee754_j1 __P((double));
240 extern double __ieee754_y0 __P((double));
241 extern double __ieee754_y1 __P((double));
242 extern double __ieee754_jn __P((int,double));
243 extern double __ieee754_yn __P((int,double));
244 extern double __ieee754_remainder __P((double,double));
245 extern int32_t __ieee754_rem_pio2 __P((double,double*));
247 extern double __ieee754_scalb __P((double,int));
249 extern double __ieee754_scalb __P((double,double));
252 /* fdlibm kernel function */
253 extern double __kernel_standard __P((double,double,int));
254 extern double __kernel_sin __P((double,double,int));
255 extern double __kernel_cos __P((double,double));
256 extern double __kernel_tan __P((double,double,int));
257 extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*));
259 /* Classpath extensions */
261 /* The original code used statements like
262 n0 = ((*(int*)&one)>>29)^1; * index of high word *
263 ix0 = *(n0+(int*)&x); * high word of x *
264 ix1 = *((1-n0)+(int*)&x); * low word of x *
265 to dig two 32 bit words out of the 64 bit IEEE floating point
266 value. That is non-ANSI, and, moreover, the gcc instruction
267 scheduler gets it wrong. We instead use the following macros.
268 Unlike the original code, we determine the endianness at compile
269 time, not at run time; I don't see much benefit to selecting
270 endianness at run time. */
272 #ifndef __IEEE_BIG_ENDIAN
273 #ifndef __IEEE_LITTLE_ENDIAN
274 #error Must define endianness
278 /* A union which permits us to convert between a double and two 32 bit
281 #ifdef __IEEE_BIG_ENDIAN
291 } ieee_double_shape_type;
295 #ifdef __IEEE_LITTLE_ENDIAN
305 } ieee_double_shape_type;
309 /* Get two 32 bit ints from a double. */
311 #define EXTRACT_WORDS(ix0,ix1,d) \
313 ieee_double_shape_type ew_u; \
315 (ix0) = ew_u.parts.msw; \
316 (ix1) = ew_u.parts.lsw; \
319 /* Get the more significant 32 bit int from a double. */
321 #define GET_HIGH_WORD(i,d) \
323 ieee_double_shape_type gh_u; \
325 (i) = gh_u.parts.msw; \
328 /* Get the less significant 32 bit int from a double. */
330 #define GET_LOW_WORD(i,d) \
332 ieee_double_shape_type gl_u; \
334 (i) = gl_u.parts.lsw; \
337 /* Set a double from two 32 bit ints. */
339 #define INSERT_WORDS(d,ix0,ix1) \
341 ieee_double_shape_type iw_u; \
342 iw_u.parts.msw = (ix0); \
343 iw_u.parts.lsw = (ix1); \
347 /* Set the more significant 32 bits of a double from an int. */
349 #define SET_HIGH_WORD(d,v) \
351 ieee_double_shape_type sh_u; \
353 sh_u.parts.msw = (v); \
357 /* Set the less significant 32 bits of a double from an int. */
359 #define SET_LOW_WORD(d,v) \
361 ieee_double_shape_type sl_u; \
363 sl_u.parts.lsw = (v); \
367 /* A union which permits us to convert between a float and a 32 bit
374 } ieee_float_shape_type;
376 /* Get a 32 bit int from a float. */
378 #define GET_FLOAT_WORD(i,d) \
380 ieee_float_shape_type gf_u; \
385 /* Set a float from a 32 bit int. */
387 #define SET_FLOAT_WORD(d,i) \
389 ieee_float_shape_type sf_u; \
398 #endif /* __CLASSPATH_FDLIBM_H__ */