blob: b28f42a907405e57ac0532b62db1a61524de7faf [file] [log] [blame]
Piotr Jasiukajtis25c28e832014-02-04 20:31:57 +01001/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
23 */
24/*
25 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
26 * Use is subject to license terms.
27 */
28
29#ifndef _MATH_H
30#define _MATH_H
31
32#include <iso/math_iso.h>
33#include <iso/math_c99.h>
34
35#if __cplusplus >= 199711L
36using std::abs;
37using std::acos;
38using std::asin;
39using std::atan2;
40using std::atan;
41using std::ceil;
42using std::cos;
43using std::cosh;
44using std::exp;
45using std::fabs;
46using std::floor;
47using std::fmod;
48using std::frexp;
49using std::ldexp;
50using std::log10;
51using std::log;
52using std::modf;
53using std::pow;
54using std::sin;
55using std::sinh;
56using std::sqrt;
57using std::tan;
58using std::tanh;
59#endif
60
61#ifdef __cplusplus
62extern "C" {
63#endif
64
65#if defined(__cplusplus)
66#define exception __math_exception
67#endif
68
69#ifndef __P
70#ifdef __STDC__
71#define __P(p) p
72#else
73#define __P(p) ()
74#endif
75#endif /* !defined(__P) */
76
77#if defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) || \
78 !defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)
79/*
80 * SVID & X/Open
81 */
82#define M_E 2.7182818284590452354
83#define M_LOG2E 1.4426950408889634074
84#define M_LOG10E 0.43429448190325182765
85#define M_LN2 0.69314718055994530942
86#define M_LN10 2.30258509299404568402
87#define M_PI 3.14159265358979323846
88#define M_PI_2 1.57079632679489661923
89#define M_PI_4 0.78539816339744830962
90#define M_1_PI 0.31830988618379067154
91#define M_2_PI 0.63661977236758134308
92#define M_2_SQRTPI 1.12837916709551257390
93#define M_SQRT2 1.41421356237309504880
94#define M_SQRT1_2 0.70710678118654752440
95
96extern int signgam;
97
98#define MAXFLOAT ((float)3.40282346638528860e+38)
99
100#if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE)
101/*
102 * SVID
103 */
104enum version {libm_ieee = -1, c_issue_4, ansi_1, strict_ansi};
105
106#ifdef __STDC__
107extern const enum version _lib_version;
108#else
109extern enum version _lib_version;
110#endif
111
112struct exception {
113 int type;
114 char *name;
115 double arg1;
116 double arg2;
117 double retval;
118};
119
120#define HUGE MAXFLOAT
121
122#define _ABS(x) ((x) < 0 ? -(x) : (x))
123
124#define _REDUCE(TYPE, X, XN, C1, C2) { \
125 double x1 = (double)(TYPE)X, x2 = X - x1; \
126 X = x1 - (XN) * (C1); X += x2; X -= (XN) * (C2); }
127
128#define DOMAIN 1
129#define SING 2
130#define OVERFLOW 3
131#define UNDERFLOW 4
132#define TLOSS 5
133#define PLOSS 6
134
135#define _POLY1(x, c) ((c)[0] * (x) + (c)[1])
136#define _POLY2(x, c) (_POLY1((x), (c)) * (x) + (c)[2])
137#define _POLY3(x, c) (_POLY2((x), (c)) * (x) + (c)[3])
138#define _POLY4(x, c) (_POLY3((x), (c)) * (x) + (c)[4])
139#define _POLY5(x, c) (_POLY4((x), (c)) * (x) + (c)[5])
140#define _POLY6(x, c) (_POLY5((x), (c)) * (x) + (c)[6])
141#define _POLY7(x, c) (_POLY6((x), (c)) * (x) + (c)[7])
142#define _POLY8(x, c) (_POLY7((x), (c)) * (x) + (c)[8])
143#define _POLY9(x, c) (_POLY8((x), (c)) * (x) + (c)[9])
144#endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) */
145
146/*
147 * SVID & X/Open
148 */
149/* BEGIN adopted by C99 */
150extern double erf __P((double));
151extern double erfc __P((double));
152extern double hypot __P((double, double));
153extern double lgamma __P((double));
154
155#if defined(__MATHERR_ERRNO_DONTCARE)
156#pragma does_not_read_global_data(erf, erfc, hypot)
157#pragma does_not_write_global_data(erf, erfc, hypot)
158#pragma no_side_effect(erf, erfc, hypot)
159#endif
160
161#if !defined(_STDC_C99) && _XOPEN_SOURCE - 0 < 600 && !defined(__C99FEATURES__)
162extern int isnan __P((double));
163
164#pragma does_not_read_global_data(isnan)
165#pragma does_not_write_global_data(isnan)
166#pragma no_side_effect(isnan)
167#endif
168/* END adopted by C99 */
169
170#if defined(__EXTENSIONS__) || _XOPEN_SOURCE - 0 < 600
171extern double gamma __P((double)); /* deprecated; use lgamma */
172#endif
173extern double j0 __P((double));
174extern double j1 __P((double));
175extern double jn __P((int, double));
176extern double y0 __P((double));
177extern double y1 __P((double));
178extern double yn __P((int, double));
179
180#if defined(__MATHERR_ERRNO_DONTCARE)
181#pragma does_not_read_global_data(j0, j1, jn, y0, y1, yn)
182#pragma does_not_write_global_data(j0, j1, jn, y0, y1, yn)
183#pragma no_side_effect(j0, j1, jn, y0, y1, yn)
184#endif
185#if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) || \
186 _XOPEN_SOURCE - 0 >= 500 || \
187 defined(_XOPEN_SOURCE) && _XOPEN_SOURCE_EXTENDED - 0 == 1
188/*
189 * SVID & XPG 4.2/5
190 */
191extern double scalb __P((double, double));
192
193#if defined(__MATHERR_ERRNO_DONTCARE)
194#pragma does_not_read_global_data(scalb)
195#pragma does_not_write_global_data(scalb)
196#pragma no_side_effect(scalb)
197#endif
198
199/* BEGIN adopted by C99 */
200extern double acosh __P((double));
201extern double asinh __P((double));
202extern double atanh __P((double));
203extern double cbrt __P((double));
204extern double logb __P((double));
205extern double nextafter __P((double, double));
206extern double remainder __P((double, double));
207
208/*
209 * XPG 4.2/5
210 */
211extern double expm1 __P((double));
212extern int ilogb __P((double));
213extern double log1p __P((double));
214extern double rint __P((double));
215
216#if defined(__MATHERR_ERRNO_DONTCARE)
217#pragma does_not_read_global_data(acosh, asinh, atanh, cbrt)
218#pragma does_not_read_global_data(logb, nextafter, remainder)
219#pragma does_not_read_global_data(expm1, ilogb, log1p, rint)
220#pragma does_not_write_global_data(acosh, asinh, atanh, cbrt)
221#pragma does_not_write_global_data(logb, nextafter, remainder)
222#pragma does_not_write_global_data(expm1, ilogb, log1p, rint)
223#pragma no_side_effect(acosh, asinh, atanh, cbrt)
224#pragma no_side_effect(logb, nextafter, remainder)
225#pragma no_side_effect(expm1, ilogb, log1p, rint)
226#endif
227/* END adopted by C99 */
228#endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) || ... */
229
230#if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE)
231/*
232 * SVID
233 */
234extern int matherr __P((struct exception *));
235
236/*
237 * IEEE Test Vector
238 */
239extern double significand __P((double));
240
241#if defined(__MATHERR_ERRNO_DONTCARE)
242#pragma does_not_read_global_data(significand)
243#pragma does_not_write_global_data(significand)
244#pragma no_side_effect(significand)
245#endif
246
247extern int signgamf; /* deprecated; use signgam */
248extern int signgaml; /* deprecated; use signgam */
249
250extern int isnanf __P((float));
251extern int isnanl __P((long double));
252extern float gammaf __P((float)); /* deprecated; use lgammaf */
253extern float gammaf_r __P((float, int *)); /* deprecated; use lgammaf_r */
254extern float j0f __P((float));
255extern float j1f __P((float));
256extern float jnf __P((int, float));
257extern float lgammaf_r __P((float, int *));
258extern float scalbf __P((float, float));
259extern float significandf __P((float));
260extern float y0f __P((float));
261extern float y1f __P((float));
262extern float ynf __P((int, float));
263extern long double gammal __P((long double)); /* deprecated; use lgammal */
264extern long double gammal_r __P((long double, int *)); /* deprecated */
265extern long double j0l __P((long double));
266extern long double j1l __P((long double));
267extern long double jnl __P((int, long double));
268extern long double lgammal_r __P((long double, int *));
269extern long double scalbl __P((long double, long double));
270extern long double significandl __P((long double));
271extern long double y0l __P((long double));
272extern long double y1l __P((long double));
273extern long double ynl __P((int, long double));
274
275#if defined(__MATHERR_ERRNO_DONTCARE)
276#pragma does_not_read_global_data(isnanf, isnanl)
277#pragma does_not_write_global_data(isnanf, isnanl)
278#pragma no_side_effect(isnanf, isnanl)
279#pragma does_not_read_global_data(gammaf_r, j0f, j1f, jnf, lgammaf_r, scalbf)
280#pragma does_not_read_global_data(significandf, y0f, y1f, ynf)
281#pragma does_not_write_global_data(j0f, j1f, jnf, scalbf)
282#pragma does_not_write_global_data(significandf, y0f, y1f, ynf)
283#pragma no_side_effect(j0f, j1f, jnf, scalbf)
284#pragma no_side_effect(significandf, y0f, y1f, ynf)
285#pragma does_not_read_global_data(gammal_r, j0l, j1l, jnl, lgammal_r, scalbl)
286#pragma does_not_read_global_data(significandl, y0l, y1l, ynl)
287#pragma does_not_write_global_data(j0l, j1l, jnl, scalbl)
288#pragma does_not_write_global_data(significandl, y0l, y1l, ynl)
289#pragma no_side_effect(j0l, j1l, jnl, scalbl)
290#pragma no_side_effect(significandl, y0l, y1l, ynl)
291#endif
292
293/*
294 * for sin+cos->sincos transformation
295 */
296extern void sincos __P((double, double *, double *));
297extern void sincosf __P((float, float *, float *));
298extern void sincosl __P((long double, long double *, long double *));
299
300#if defined(__MATHERR_ERRNO_DONTCARE)
301#pragma does_not_read_global_data(sincos, sincosf, sincosl)
302#endif
303
304/* BEGIN adopted by C99 */
305/*
306 * Functions callable from C, intended to support IEEE arithmetic.
307 */
308extern double copysign __P((double, double));
309extern double scalbn __P((double, int));
310
311#if defined(__MATHERR_ERRNO_DONTCARE)
312#pragma does_not_read_global_data(copysign, scalbn)
313#pragma does_not_write_global_data(copysign, scalbn)
314#pragma no_side_effect(copysign, scalbn)
315#endif
316/* END adopted by C99 */
317
318/*
319 * Reentrant version of gamma & lgamma; passes signgam back by reference
320 * as the second argument; user must allocate space for signgam.
321 */
322extern double gamma_r __P((double, int *)); /* deprecated; use lgamma_r */
323extern double lgamma_r __P((double, int *));
324
325#if defined(__MATHERR_ERRNO_DONTCARE)
326#pragma does_not_read_global_data(gamma_r, lgamma_r)
327#endif
328
329/* BEGIN adopted by C99 */
330extern float modff __P((float, float *));
331
332#if defined(__MATHERR_ERRNO_DONTCARE)
333#pragma does_not_read_global_data(modff)
334#endif
335/* END adopted by C99 */
336
337#if defined(__EXTENSIONS__) || !defined(__cplusplus)
338#include <floatingpoint.h>
339#endif
340#endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) */
341#endif /* defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) || ... */
342
343#if defined(__cplusplus) && defined(__GNUC__)
344#undef exception
345#endif
346
347#ifdef __cplusplus
348}
349#endif
350
351#endif /* _MATH_H */