blob: 4d174f9317a1ca54b5803e0c0e45c6a46dbec000 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001/*
2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4 *
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
8 * is preserved.
9 * ====================================================
10 */
11
12/*
13 * from: @(#)fdlibm.h 5.1 93/09/24
Elliott Hughesa0ee0782013-01-30 19:06:37 -080014 * $FreeBSD$
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080015 */
16
17#ifndef _MATH_H_
18#define _MATH_H_
19
20#include <sys/cdefs.h>
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080021#include <limits.h>
22
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080023/*
24 * ANSI/POSIX
25 */
26extern const union __infinity_un {
27 unsigned char __uc[8];
28 double __ud;
29} __infinity;
30
31extern const union __nan_un {
32 unsigned char __uc[sizeof(float)];
33 float __uf;
34} __nan;
35
Elliott Hughesa0ee0782013-01-30 19:06:37 -080036#if __GNUC_PREREQ__(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080037#define __MATH_BUILTIN_CONSTANTS
38#endif
39
Elliott Hughesa0ee0782013-01-30 19:06:37 -080040#if __GNUC_PREREQ__(3, 0) && !defined(__INTEL_COMPILER)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080041#define __MATH_BUILTIN_RELOPS
42#endif
43
Elliott Hughesa0ee0782013-01-30 19:06:37 -080044#ifdef __MATH_BUILTIN_CONSTANTS
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080045#define HUGE_VAL __builtin_huge_val()
46#else
47#define HUGE_VAL (__infinity.__ud)
48#endif
49
Elliott Hughesa0ee0782013-01-30 19:06:37 -080050#if __ISO_C_VISIBLE >= 1999
51#define FP_ILOGB0 (-INT_MAX) /* Android-changed */
52#define FP_ILOGBNAN INT_MAX /* Android-changed */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080053
54#ifdef __MATH_BUILTIN_CONSTANTS
55#define HUGE_VALF __builtin_huge_valf()
56#define HUGE_VALL __builtin_huge_vall()
Elliott Hughesa0ee0782013-01-30 19:06:37 -080057#define INFINITY __builtin_inff()
58#define NAN __builtin_nanf("")
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080059#else
60#define HUGE_VALF (float)HUGE_VAL
61#define HUGE_VALL (long double)HUGE_VAL
62#define INFINITY HUGE_VALF
63#define NAN (__nan.__uf)
64#endif /* __MATH_BUILTIN_CONSTANTS */
65
66#define MATH_ERRNO 1
67#define MATH_ERREXCEPT 2
68#define math_errhandling MATH_ERREXCEPT
69
Elliott Hughesa0ee0782013-01-30 19:06:37 -080070#define FP_FAST_FMAF 1
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080071#ifdef __ia64__
Elliott Hughesa0ee0782013-01-30 19:06:37 -080072#define FP_FAST_FMA 1
73#define FP_FAST_FMAL 1
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080074#endif
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080075
76/* Symbolic constants to classify floating point numbers. */
77#define FP_INFINITE 0x01
78#define FP_NAN 0x02
79#define FP_NORMAL 0x04
80#define FP_SUBNORMAL 0x08
81#define FP_ZERO 0x10
82#define fpclassify(x) \
83 ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
84 : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
85 : __fpclassifyl(x))
86
87#define isfinite(x) \
88 ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
89 : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
90 : __isfinitel(x))
91#define isinf(x) \
92 ((sizeof (x) == sizeof (float)) ? __isinff(x) \
Elliott Hughesa0ee0782013-01-30 19:06:37 -080093 : (sizeof (x) == sizeof (double)) ? isinf(x) \
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080094 : __isinfl(x))
95#define isnan(x) \
Elliott Hughesa0ee0782013-01-30 19:06:37 -080096 ((sizeof (x) == sizeof (float)) ? __isnanf(x) \
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080097 : (sizeof (x) == sizeof (double)) ? isnan(x) \
98 : __isnanl(x))
99#define isnormal(x) \
100 ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
101 : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
102 : __isnormall(x))
103
104#ifdef __MATH_BUILTIN_RELOPS
105#define isgreater(x, y) __builtin_isgreater((x), (y))
106#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
107#define isless(x, y) __builtin_isless((x), (y))
108#define islessequal(x, y) __builtin_islessequal((x), (y))
109#define islessgreater(x, y) __builtin_islessgreater((x), (y))
110#define isunordered(x, y) __builtin_isunordered((x), (y))
111#else
112#define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y))
113#define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y))
114#define isless(x, y) (!isunordered((x), (y)) && (x) < (y))
115#define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y))
116#define islessgreater(x, y) (!isunordered((x), (y)) && \
117 ((x) > (y) || (y) > (x)))
118#define isunordered(x, y) (isnan(x) || isnan(y))
119#endif /* __MATH_BUILTIN_RELOPS */
120
121#define signbit(x) \
122 ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
123 : (sizeof (x) == sizeof (double)) ? __signbit(x) \
124 : __signbitl(x))
125
Elliott Hughes9f87a0b2014-02-07 14:55:58 -0800126typedef double __double_t;
127typedef __double_t double_t;
128typedef float __float_t;
129typedef __float_t float_t;
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800130#endif /* __ISO_C_VISIBLE >= 1999 */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800131
132/*
133 * XOPEN/SVID
134 */
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800135#if __BSD_VISIBLE || __XSI_VISIBLE
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800136#define M_E 2.7182818284590452354 /* e */
137#define M_LOG2E 1.4426950408889634074 /* log 2e */
138#define M_LOG10E 0.43429448190325182765 /* log 10e */
139#define M_LN2 0.69314718055994530942 /* log e2 */
140#define M_LN10 2.30258509299404568402 /* log e10 */
141#define M_PI 3.14159265358979323846 /* pi */
142#define M_PI_2 1.57079632679489661923 /* pi/2 */
143#define M_PI_4 0.78539816339744830962 /* pi/4 */
144#define M_1_PI 0.31830988618379067154 /* 1/pi */
145#define M_2_PI 0.63661977236758134308 /* 2/pi */
146#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
147#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
148#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
149
150#define MAXFLOAT ((float)3.40282346638528860e+38)
151extern int signgam;
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800152#endif /* __BSD_VISIBLE || __XSI_VISIBLE */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800153
154#if __BSD_VISIBLE
155#if 0
156/* Old value from 4.4BSD-Lite math.h; this is probably better. */
157#define HUGE HUGE_VAL
158#else
159#define HUGE MAXFLOAT
160#endif
161#endif /* __BSD_VISIBLE */
162
163/*
164 * Most of these functions depend on the rounding mode and have the side
165 * effect of raising floating-point exceptions, so they are not declared
166 * as __pure2. In C99, FENV_ACCESS affects the purity of these functions.
167 */
168__BEGIN_DECLS
169/*
170 * ANSI/POSIX
171 */
172int __fpclassifyd(double) __pure2;
173int __fpclassifyf(float) __pure2;
174int __fpclassifyl(long double) __pure2;
175int __isfinitef(float) __pure2;
176int __isfinite(double) __pure2;
177int __isfinitel(long double) __pure2;
178int __isinff(float) __pure2;
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800179int __isinfl(long double) __pure2;
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800180int __isnanf(float) __pure2;
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800181int __isnanl(long double) __pure2;
182int __isnormalf(float) __pure2;
183int __isnormal(double) __pure2;
184int __isnormall(long double) __pure2;
185int __signbit(double) __pure2;
186int __signbitf(float) __pure2;
187int __signbitl(long double) __pure2;
188
189double acos(double);
190double asin(double);
191double atan(double);
192double atan2(double, double);
193double cos(double);
194double sin(double);
195double tan(double);
196
197double cosh(double);
198double sinh(double);
199double tanh(double);
200
201double exp(double);
202double frexp(double, int *); /* fundamentally !__pure2 */
203double ldexp(double, int);
204double log(double);
205double log10(double);
206double modf(double, double *); /* fundamentally !__pure2 */
207
208double pow(double, double);
209double sqrt(double);
210
211double ceil(double);
212double fabs(double) __pure2;
213double floor(double);
214double fmod(double, double);
215
216/*
217 * These functions are not in C90.
218 */
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800219#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800220double acosh(double);
221double asinh(double);
222double atanh(double);
223double cbrt(double);
224double erf(double);
225double erfc(double);
226double exp2(double);
227double expm1(double);
228double fma(double, double, double);
229double hypot(double, double);
230int ilogb(double) __pure2;
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800231int (isinf)(double) __pure2;
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800232int (isnan)(double) __pure2;
233double lgamma(double);
234long long llrint(double);
235long long llround(double);
236double log1p(double);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800237double log2(double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800238double logb(double);
239long lrint(double);
240long lround(double);
David 'Digit' Turner8e2ff162011-01-25 17:05:50 +0100241double nan(const char *) __pure2;
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800242double nextafter(double, double);
243double remainder(double, double);
244double remquo(double, double, int *);
245double rint(double);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800246#endif /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800247
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800248#if __BSD_VISIBLE || __XSI_VISIBLE
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800249double j0(double);
250double j1(double);
251double jn(int, double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800252double y0(double);
253double y1(double);
254double yn(int, double);
255
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800256#if __XSI_VISIBLE <= 500 || __BSD_VISIBLE
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800257double gamma(double);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800258#endif
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800259
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800260#if __XSI_VISIBLE <= 600 || __BSD_VISIBLE
261double scalb(double, double);
262#endif
263#endif /* __BSD_VISIBLE || __XSI_VISIBLE */
264
265#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800266double copysign(double, double) __pure2;
267double fdim(double, double);
268double fmax(double, double) __pure2;
269double fmin(double, double) __pure2;
270double nearbyint(double);
271double round(double);
272double scalbln(double, long);
273double scalbn(double, int);
274double tgamma(double);
275double trunc(double);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800276#endif
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800277
278/*
279 * BSD math library entry points
280 */
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800281#if __BSD_VISIBLE
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800282double drem(double, double);
283int finite(double) __pure2;
284int isnanf(float) __pure2;
285
286/*
287 * Reentrant version of gamma & lgamma; passes signgam back by reference
288 * as the second argument; user must allocate space for signgam.
289 */
290double gamma_r(double, int *);
291double lgamma_r(double, int *);
292
293/*
294 * IEEE Test Vector
295 */
296double significand(double);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800297#endif /* __BSD_VISIBLE */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800298
299/* float versions of ANSI/POSIX functions */
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800300#if __ISO_C_VISIBLE >= 1999
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800301float acosf(float);
302float asinf(float);
303float atanf(float);
304float atan2f(float, float);
305float cosf(float);
306float sinf(float);
307float tanf(float);
308
309float coshf(float);
310float sinhf(float);
311float tanhf(float);
312
313float exp2f(float);
314float expf(float);
315float expm1f(float);
316float frexpf(float, int *); /* fundamentally !__pure2 */
317int ilogbf(float) __pure2;
318float ldexpf(float, int);
319float log10f(float);
320float log1pf(float);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800321float log2f(float);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800322float logf(float);
323float modff(float, float *); /* fundamentally !__pure2 */
324
325float powf(float, float);
326float sqrtf(float);
327
328float ceilf(float);
329float fabsf(float) __pure2;
330float floorf(float);
331float fmodf(float, float);
332float roundf(float);
333
334float erff(float);
335float erfcf(float);
336float hypotf(float, float);
337float lgammaf(float);
David 'Digit' Turner8e2ff162011-01-25 17:05:50 +0100338float tgammaf(float);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800339
340float acoshf(float);
341float asinhf(float);
342float atanhf(float);
343float cbrtf(float);
344float logbf(float);
345float copysignf(float, float) __pure2;
346long long llrintf(float);
347long long llroundf(float);
348long lrintf(float);
349long lroundf(float);
David 'Digit' Turner8e2ff162011-01-25 17:05:50 +0100350float nanf(const char *) __pure2;
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800351float nearbyintf(float);
352float nextafterf(float, float);
353float remainderf(float, float);
354float remquof(float, float, int *);
355float rintf(float);
356float scalblnf(float, long);
357float scalbnf(float, int);
358float truncf(float);
359
360float fdimf(float, float);
361float fmaf(float, float, float);
362float fmaxf(float, float) __pure2;
363float fminf(float, float) __pure2;
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800364#endif
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800365
366/*
367 * float versions of BSD math library entry points
368 */
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800369#if __BSD_VISIBLE
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800370float dremf(float, float);
371int finitef(float) __pure2;
372float gammaf(float);
373float j0f(float);
374float j1f(float);
375float jnf(int, float);
376float scalbf(float, float);
377float y0f(float);
378float y1f(float);
379float ynf(int, float);
380
381/*
382 * Float versions of reentrant version of gamma & lgamma; passes
383 * signgam back by reference as the second argument; user must
384 * allocate space for signgam.
385 */
386float gammaf_r(float, int *);
387float lgammaf_r(float, int *);
388
389/*
390 * float version of IEEE Test Vector
391 */
392float significandf(float);
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800393#endif /* __BSD_VISIBLE */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800394
395/*
396 * long double versions of ISO/POSIX math functions
397 */
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800398#if __ISO_C_VISIBLE >= 1999
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700399long double acoshl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800400long double acosl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700401long double asinhl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800402long double asinl(long double);
403long double atan2l(long double, long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700404long double atanhl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800405long double atanl(long double);
406long double cbrtl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800407long double ceill(long double);
408long double copysignl(long double, long double) __pure2;
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700409long double coshl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800410long double cosl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700411long double erfcl(long double);
412long double erfl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800413long double exp2l(long double);
414long double expl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700415long double expm1l(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800416long double fabsl(long double) __pure2;
417long double fdiml(long double, long double);
418long double floorl(long double);
419long double fmal(long double, long double, long double);
420long double fmaxl(long double, long double) __pure2;
421long double fminl(long double, long double) __pure2;
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800422long double fmodl(long double, long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800423long double frexpl(long double value, int *); /* fundamentally !__pure2 */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800424long double hypotl(long double, long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800425int ilogbl(long double) __pure2;
426long double ldexpl(long double, int);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700427long double lgammal(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800428long long llrintl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800429long long llroundl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700430long double log10l(long double);
431long double log1pl(long double);
432long double log2l(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800433long double logbl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700434long double logl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800435long lrintl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800436long lroundl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800437long double modfl(long double, long double *); /* fundamentally !__pure2 */
438long double nanl(const char *) __pure2;
439long double nearbyintl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800440long double nextafterl(long double, long double);
441double nexttoward(double, long double);
442float nexttowardf(float, long double);
443long double nexttowardl(long double, long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700444long double powl(long double, long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800445long double remainderl(long double, long double);
446long double remquol(long double, long double, int *);
447long double rintl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800448long double roundl(long double);
449long double scalblnl(long double, long);
450long double scalbnl(long double, int);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700451long double sinhl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800452long double sinl(long double);
453long double sqrtl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700454long double tanhl(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800455long double tanl(long double);
Elliott Hughes9a5a3e82014-05-05 20:28:28 -0700456long double tgammal(long double);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800457long double truncl(long double);
458
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800459#endif /* __ISO_C_VISIBLE >= 1999 */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800460__END_DECLS
461
462#endif /* !_MATH_H_ */