xref: /haiku/headers/posix/math.h (revision 746cac055adc6ac3308c7bc2d29040fb95689cc9)
1 /*
2  * Copyright 2001-2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _MATH_H_
6 #define _MATH_H_
7 
8 
9 #define M_E				2.7182818284590452354	/* e */
10 #define M_LOG2E			1.4426950408889634074	/* log 2e */
11 #define M_LOG10E		0.43429448190325182765	/* log 10e */
12 #define M_LN2			0.69314718055994530942	/* log e2 */
13 #define M_LN10			2.30258509299404568402	/* log e10 */
14 #define M_PI			3.14159265358979323846	/* pi */
15 #define M_PI_2			1.57079632679489661923	/* pi/2 */
16 #define M_PI_4			0.78539816339744830962	/* pi/4 */
17 #define M_1_PI			0.31830988618379067154	/* 1/pi */
18 #define M_2_PI			0.63661977236758134308	/* 2/pi */
19 #define M_2_SQRTPI		1.12837916709551257390	/* 2/sqrt(pi) */
20 #define M_SQRT2			1.41421356237309504880	/* sqrt(2) */
21 #define M_SQRT1_2		0.70710678118654752440	/* 1/sqrt(2) */
22 
23 #define PI				M_PI
24 #define PI2				M_PI_2
25 
26 /* platform independent IEEE floating point special values */
27 #define	__HUGE_VAL_v	0x7ff0000000000000LL
28 #define __huge_val_t	union { unsigned char __c[8]; long long __ll; double __d; }
29 #ifndef HUGE_VAL
30 #	define HUGE_VAL		(((__huge_val_t) { __ll: __HUGE_VAL_v }).__d)
31 #endif
32 
33 #define __HUGE_VALF_v	0x7f800000L
34 #define __huge_valf_t	union { unsigned char __c[4]; long __l; float __f; }
35 #define HUGE_VALF		(((__huge_valf_t) { __l: __HUGE_VALF_v }).__f)
36 
37 /* ToDo: define HUGE_VALL for long doubles */
38 
39 #define __NAN_VALF_v	0x7fc00000L
40 #define NAN				(((__huge_valf_t) { __l: __NAN_VALF_v }).__f)
41 
42 #define INFINITY		HUGE_VALF
43 
44 /* floating-point categories */
45 #define FP_NAN			0
46 #define FP_INFINITE		1
47 #define FP_ZERO			2
48 #define FP_SUBNORMAL	3
49 #define FP_NORMAL		4
50 
51 #ifdef __cplusplus
52 struct __exception;
53 extern "C" int matherr(struct __exception *);
54 struct __exception {
55 #else
56 struct exception;
57 extern int matherr(struct exception *);
58 struct exception {
59 #endif
60 	int		type;
61 	char	*name;
62 	double	arg1;
63 	double	arg2;
64 	double	retval;
65 };
66 
67 #define DOMAIN		1
68 #define SING		2
69 #define OVERFLOW	3
70 #define UNDERFLOW	4
71 #define TLOSS		5
72 #define PLOSS		6
73 
74 extern int signgam;
75 
76 
77 #ifdef __cplusplus
78 extern "C" {
79 #endif
80 
81 /* float math functions */
82 extern float	acosf(float x);
83 extern float	acoshf(float x);
84 extern float	asinf(float x);
85 extern float	asinhf(float x);
86 extern float	atan2f(float y, float x);
87 extern float	atanf(float x);
88 extern float	atanhf(float x);
89 extern float	cbrtf(float x);
90 extern float	ceilf(float x);
91 extern float	cosf(float x);
92 extern float	coshf(float x);
93 extern float	expf(float x);
94 extern float	expm1f(float x);
95 extern float	fabsf(float x);
96 extern float	floorf(float x);
97 extern float	fmodf(float x, float y);
98 extern float	frexpf(float x, int *_exponent);
99 extern float	gammaf(float x);
100 extern float	hypotf(float x, float y);
101 extern float	ldexpf(float x, int exponent);
102 extern float	lgammaf(float x);
103 extern float	log10f(float x);
104 extern float	log1pf(float x);
105 extern float	logbf(float x);
106 extern float	logf(float x);
107 extern long	lroundf(float x);
108 extern float	modff(float x, float *y);
109 extern float	nearbyintf(float x);
110 extern float	powf(float x, float y);
111 extern float	remquof(float x, float y, int *quo);
112 extern float	roundf(float x);
113 extern float	sinf(float x);
114 extern float	sinhf(float x);
115 extern float	sqrtf(float x);
116 extern float	tanf(float x);
117 extern float	tanhf(float x);
118 
119 /* double math functions */
120 extern double	acos(double x);
121 extern double	acosh(double x);
122 extern double	asin(double x);
123 extern double	asinh(double x);
124 extern double	atan(double x);
125 extern double	atan2(double x, double y);
126 extern double	atanh(double x);
127 extern double	ceil(double x);
128 extern double	cos(double x);
129 extern double	cosh(double x);
130 extern double	exp(double x);
131 extern double	fabs(double x);
132 extern double	floor(double x);
133 extern double	fmod(double x, double y);
134 extern double	frexp(double x, int *_exponent);
135 extern double	gamma(double x);
136 extern double	ldexp(double x, int exponent);
137 extern double	lgamma(double x);
138 extern double	log(double x);
139 extern double	log10(double x);
140 extern long	lround(double x);
141 extern double	modf(double x, double *y);
142 extern double	nearbyint(double x);
143 extern double	pow(double x, double y);
144 extern double	remquo(double x, double y, int *quo);
145 extern double	round(double x);
146 extern double	sin(double x);
147 extern double	sinh(double x);
148 extern double	sqrt(double x);
149 extern double	tan(double x);
150 extern double	tanh(double x);
151 extern double	trunc(double x);
152 
153 /* long double math functions */
154 extern long double 	acosl(long double x);
155 extern long double 	acoshl(long double x);
156 extern long double 	asinl(long double x);
157 extern long double 	atanl(long double x);
158 extern long double 	atanhl(long double x);
159 extern long double 	atan2l(long double y, long double x);
160 extern long double	lgammal(long double x);
161 extern long double 	nearbyintl(long double x);
162 extern long double	roundl(long double x);
163 extern long		lroundl(long double x);
164 extern long double 	remquol(long double x, long double y, int *quo);
165 
166 /* some BSD non-ANSI or POSIX math functions */
167 extern double	cbrt(double x);
168 extern double	erf(double x);
169 extern double	erfc(double x);
170 extern double	expm1(double x);
171 extern double	gamma_r(double x, int *y);
172 extern double	hypot(double x, double y);
173 extern int		ilogb(double x);
174 extern double	j0(double x);
175 extern double	j1(double x);
176 extern double	jn(int x, double y);
177 extern double	lgamma_r(double x, int *y);
178 extern double	log1p(double x);
179 extern double	logb(double x);
180 extern double	nextafter(double x, double y);
181 extern double	nexttoward(double x, long double y);
182 extern double	remainder(double x, double y);
183 extern double	rint(double x);
184 extern double	scalb (double x, double y);
185 extern double	y0(double x);
186 extern double	y1(double x);
187 extern double	yn(int x, double y);
188 
189 /* other stuff as defined in BeOS */
190 extern int		isinff(float value);
191 extern int		finitef(float value);
192 extern float	dremf(float x, float y);
193 extern float	significandf(float x);
194 extern float	copysignf(float x, float y);
195 extern int		isnanf(float value);
196 extern double	significand(double x);
197 extern double	copysign(double x, double y);
198 extern double 	scalbln(double x, long n);
199 extern double	scalbn(double x, int y);
200 extern double	drem(double x, double y);
201 extern int		finite(double x);
202 extern float	j0f(float x);
203 extern float	j1f(float x);
204 extern float	jnf(int x, float y);
205 extern float	y0f(float x);
206 extern float	y1f(float x);
207 extern float	ynf(int x, float y);
208 extern float	erff(float x);
209 extern float	erfcf(float x);
210 extern float	gammaf_r(float x, int *y);
211 extern float	lgammaf_r(float x, int *y);
212 extern float	rintf(float x);
213 extern float	nextafterf(float x, float y);
214 extern float	nexttowardf(float x, long double y);
215 extern float	remainderf(float x, float y);
216 extern float	scalbf(float x, float n);
217 extern float	scalbnf(float x, int n);
218 extern int	ilogbf(float x);
219 
220 extern long double	nextafterl(long double x, long double y);
221 extern long double	nexttowardl(long double x, long double y);
222 extern long double	remainderl(long double x, long double y);
223 extern long double	rintl(long double x);
224 extern long double	scalbnl(long double x, int n);
225 extern long double	scalblnl(long double x, long n);
226 
227 /* prototypes for functions used in the macros below */
228 extern int		__fpclassifyf(float value);
229 extern int		__signbitf(float value);
230 extern int		__finitef(float value);
231 extern int		__isnanf(float value);
232 extern int		__isinff(float value);
233 
234 extern int		__fpclassifyl(long double value);
235 extern int		__signbitl(long double value);
236 extern int		__finitel(long double value);
237 extern int		__isnanl(long double value);
238 extern int		__isinfl(long double value);
239 
240 extern int		__fpclassify(double value);
241 extern int		__signbit(double value);
242 extern int		__finite(double value);
243 extern int		__isnan(double value);
244 extern int		__isinf(double value);
245 
246 /* returns number of classification appropriate for 'value' */
247 #define fpclassify(value) \
248 	(sizeof(value) == sizeof(float) ? __fpclassifyf(value)		\
249 		: sizeof(value) == sizeof(double) ? __fpclassify(value)	\
250 		: __fpclassifyl(value))
251 
252 /* returns non-zero if 'value' is negative */
253 # define signbit(value) \
254 	(sizeof(value) == sizeof(float) ? __signbitf(value)			\
255 		: sizeof(value) == sizeof(double) ? __signbit(value)	\
256 		: __signbitl(value))
257 
258 /* returns non-zero if 'value' is not Inf or NaN */
259 # define isfinite(value) \
260 	(sizeof(value) == sizeof(float) ? __finitef(value)			\
261 		: sizeof(value) == sizeof(double) ? __finite(value)		\
262 		: __finitel(value))
263 
264 /* returns non-zero if 'value' is neither zero, sub-normal, Inf, nor NaN */
265 # define isnormal(value) \
266 	(fpclassify(value) == FP_NORMAL)
267 
268 /* returns non-zero if 'value' is NaN */
269 # define isnan(value) \
270 	(sizeof(value) == sizeof(float) ? __isnanf(value)			\
271 		: sizeof(value) == sizeof(double) ? __isnan(value)		\
272 		: __isnanl(value))
273 
274 /* returns non-zero if 'value is Inf */
275 # define isinf(value) \
276 	(sizeof(value) == sizeof(float) ? __isinff(value)			\
277 		: sizeof(value) == sizeof(double) ? __isinf(value)		\
278 		: __isinfl(value))
279 
280 #ifdef __cplusplus
281 }
282 #endif
283 
284 #endif	/* _MATH_H_ */
285