1/*
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 _ISO_MATH_ISO_H
30#define	_ISO_MATH_ISO_H
31
32#include <sys/feature_tests.h>
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#if !defined(_STDC_C99) && _XOPEN_SOURCE - 0 < 600 && !defined(__C99FEATURES__)
39typedef union _h_val {
40	unsigned long _i[sizeof (double) / sizeof (unsigned long)];
41	double _d;
42} _h_val;
43
44#ifdef __STDC__
45extern const _h_val __huge_val;
46#else
47extern _h_val __huge_val;
48#endif
49#undef	HUGE_VAL
50#define	HUGE_VAL __huge_val._d
51#endif	/* !defined(_STDC_C99) && _XOPEN_SOURCE - 0 < 600 && ... */
52
53#if __cplusplus >= 199711L
54namespace std {
55#endif
56
57extern double acos(double);
58extern double asin(double);
59extern double atan(double);
60extern double atan2(double, double);
61extern double cos(double);
62extern double sin(double);
63extern double tan(double);
64
65extern double cosh(double);
66extern double sinh(double);
67extern double tanh(double);
68
69extern double exp(double);
70extern double frexp(double, int *);
71extern double ldexp(double, int);
72extern double log(double);
73extern double log10(double);
74extern double modf(double, double *);
75
76extern double pow(double, double);
77extern double sqrt(double);
78
79extern double ceil(double);
80extern double fabs(double);
81extern double floor(double);
82extern double fmod(double, double);
83
84#if defined(__MATHERR_ERRNO_DONTCARE)
85#pragma does_not_read_global_data(acos, asin, atan, atan2)
86#pragma does_not_read_global_data(cos, sin, tan, cosh, sinh, tanh)
87#pragma does_not_read_global_data(exp, log, log10, pow, sqrt)
88#pragma does_not_read_global_data(frexp, ldexp, modf)
89#pragma does_not_read_global_data(ceil, fabs, floor, fmod)
90#pragma does_not_write_global_data(acos, asin, atan, atan2)
91#pragma does_not_write_global_data(cos, sin, tan, cosh, sinh, tanh)
92#pragma does_not_write_global_data(exp, log, log10, pow, sqrt)
93#pragma does_not_write_global_data(ldexp)
94#pragma does_not_write_global_data(ceil, fabs, floor, fmod)
95#pragma no_side_effect(acos, asin, atan, atan2)
96#pragma no_side_effect(cos, sin, tan, cosh, sinh, tanh)
97#pragma no_side_effect(exp, log, log10, pow, sqrt)
98#pragma no_side_effect(ldexp)
99#pragma no_side_effect(ceil, fabs, floor, fmod)
100#endif
101
102#if __cplusplus >= 199711L
103extern float __acosf(float);
104extern float __asinf(float);
105extern float __atanf(float);
106extern float __atan2f(float, float);
107extern float __ceilf(float);
108extern float __cosf(float);
109extern float __coshf(float);
110extern float __expf(float);
111extern float __fabsf(float);
112extern float __floorf(float);
113extern float __fmodf(float, float);
114extern float __frexpf(float, int *);
115extern float __ldexpf(float, int);
116extern float __logf(float);
117extern float __log10f(float);
118extern float __modff(float, float *);
119extern float __powf(float, float);
120extern float __sinf(float);
121extern float __sinhf(float);
122extern float __sqrtf(float);
123extern float __tanf(float);
124extern float __tanhf(float);
125
126extern long double __acosl(long double);
127extern long double __asinl(long double);
128extern long double __atanl(long double);
129extern long double __atan2l(long double, long double);
130extern long double __ceill(long double);
131extern long double __cosl(long double);
132extern long double __coshl(long double);
133extern long double __expl(long double);
134extern long double __fabsl(long double);
135extern long double __floorl(long double);
136extern long double __fmodl(long double, long double);
137extern long double __frexpl(long double, int *);
138extern long double __ldexpl(long double, int);
139extern long double __logl(long double);
140extern long double __log10l(long double);
141extern long double __modfl(long double, long double *);
142extern long double __powl(long double, long double);
143extern long double __sinl(long double);
144extern long double __sinhl(long double);
145extern long double __sqrtl(long double);
146extern long double __tanl(long double);
147extern long double __tanhl(long double);
148
149extern "C++" {
150#undef	__X
151#undef	__Y
152	inline double abs(double __X) { return fabs(__X); }
153
154	inline double pow(double __X, int __Y) {
155		return (pow(__X, (double)(__Y)));
156	}
157
158	inline float abs(float __X) { return __fabsf(__X); }
159	inline float acos(float __X) { return __acosf(__X); }
160	inline float asin(float __X) { return __asinf(__X); }
161	inline float atan(float __X) { return __atanf(__X); }
162	inline float atan2(float __X, float __Y) { return __atan2f(__X, __Y); }
163	inline float ceil(float __X) { return __ceilf(__X); }
164	inline float cos(float __X) { return __cosf(__X); }
165	inline float cosh(float __X) { return __coshf(__X); }
166	inline float exp(float __X) { return __expf(__X); }
167	inline float fabs(float __X) { return __fabsf(__X); }
168	inline float floor(float __X) { return __floorf(__X); }
169	inline float fmod(float __X, float __Y) { return __fmodf(__X, __Y); }
170	inline float frexp(float __X, int *__Y) { return __frexpf(__X, __Y); }
171	inline float ldexp(float __X, int __Y) { return __ldexpf(__X, __Y); }
172	inline float log(float __X) { return __logf(__X); }
173	inline float log10(float __X) { return __log10f(__X); }
174	inline float modf(float __X, float *__Y) { return __modff(__X, __Y); }
175	inline float pow(float __X, float __Y) { return __powf(__X, __Y); }
176
177	inline float pow(float __X, int __Y) {
178		return (pow((double)(__X), (double)(__Y)));
179	}
180
181	inline float sin(float __X) { return __sinf(__X); }
182	inline float sinh(float __X) { return __sinhf(__X); }
183	inline float sqrt(float __X) { return __sqrtf(__X); }
184	inline float tan(float __X) { return __tanf(__X); }
185	inline float tanh(float __X) { return __tanhf(__X); }
186
187	inline long double abs(long double __X) { return __fabsl(__X); }
188	inline long double acos(long double __X) { return __acosl(__X); }
189	inline long double asin(long double __X) { return __asinl(__X); }
190	inline long double atan(long double __X) { return __atanl(__X); }
191
192	inline long double atan2(long double __X, long double __Y) {
193		return (__atan2l(__X, __Y));
194	}
195
196	inline long double ceil(long double __X) { return __ceill(__X); }
197	inline long double cos(long double __X) { return __cosl(__X); }
198	inline long double cosh(long double __X) { return __coshl(__X); }
199	inline long double exp(long double __X) { return __expl(__X); }
200	inline long double fabs(long double __X) { return __fabsl(__X); }
201	inline long double floor(long double __X) { return __floorl(__X); }
202
203	inline long double fmod(long double __X, long double __Y) {
204		return (__fmodl(__X, __Y));
205	}
206
207	inline long double frexp(long double __X, int *__Y) {
208		return (__frexpl(__X, __Y));
209	}
210
211	inline long double ldexp(long double __X, int __Y) {
212		return (__ldexpl(__X, __Y));
213	}
214
215	inline long double log(long double __X) { return __logl(__X); }
216	inline long double log10(long double __X) { return __log10l(__X); }
217
218	inline long double modf(long double __X, long double *__Y) {
219		return (__modfl(__X, __Y));
220	}
221
222	inline long double pow(long double __X, long double __Y) {
223		return (__powl(__X, __Y));
224	}
225
226	inline long double pow(long double __X, int __Y) {
227		return (__powl(__X, (long double) (__Y)));
228	}
229
230	inline long double sin(long double __X) { return __sinl(__X); }
231	inline long double sinh(long double __X) { return __sinhl(__X); }
232	inline long double sqrt(long double __X) { return __sqrtl(__X); }
233	inline long double tan(long double __X) { return __tanl(__X); }
234	inline long double tanh(long double __X) { return __tanhl(__X); }
235}	/* end of extern "C++" */
236#endif	/* __cplusplus >= 199711L */
237
238#if __cplusplus >= 199711L
239}	/* end of namespace std */
240#endif
241
242#ifdef __cplusplus
243}
244#endif
245
246#endif	/* _ISO_MATH_ISO_H */
247