xref: /haiku/headers/posix/math.h (revision 079eccf655ba39812b421ae1b87a727d41b50354)
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	powf(float x, float y);
110 extern float	roundf(float x);
111 extern float	sinf(float x);
112 extern float	sinhf(float x);
113 extern float	sqrtf(float x);
114 extern float	tanf(float x);
115 extern float	tanhf(float x);
116 
117 /* double math functions */
118 extern double	acos(double x);
119 extern double	asin(double x);
120 extern double	atan(double x);
121 extern double	atan2(double x, double y);
122 extern double	ceil(double x);
123 extern double	cos(double x);
124 extern double	cosh(double x);
125 extern double	exp(double x);
126 extern double	fabs(double x);
127 extern double	floor(double x);
128 extern double	fmod(double x, double y);
129 extern double	frexp(double x, int *_exponent);
130 extern double	gamma(double x);
131 extern double	ldexp(double x, int exponent);
132 extern double	log(double x);
133 extern double	log10(double x);
134 extern long		lround(double x);
135 extern double	modf(double x, double *y);
136 extern double	pow(double x, double y);
137 extern double	round(double x);
138 extern double	sin(double x);
139 extern double	sinh(double x);
140 extern double	sqrt(double x);
141 extern double	tan(double x);
142 extern double	tanh(double x);
143 extern double	trunc(double x);
144 
145 /* long double math functions */
146 extern long double	roundl(long double x);
147 extern long		lroundl(long double x);
148 
149 /* TODO: add and fix those! */
150 extern /*long*/ double	lgamma(/*long*/ double x);
151 
152 /* some BSD non-ANSI or POSIX math functions */
153 extern double	acosh(double x);
154 extern double	asinh(double x);
155 extern double	atanh(double x);
156 extern double	cbrt(double x);
157 extern double	erf(double x);
158 extern double	erfc(double x);
159 extern double	expm1(double x);
160 extern double	gamma_r(double x, int *y);
161 extern double	hypot(double x, double y);
162 extern int		ilogb(double x);
163 extern double	j0(double x);
164 extern double	j1(double x);
165 extern double	jn(int x, double y);
166 extern double	lgamma_r(double x, int *y);
167 extern double	log1p(double x);
168 extern double	logb(double x);
169 extern double	nextafter(double x, double y);
170 extern double	remainder(double x, double y);
171 extern double	rint(double x);
172 extern double	scalb (double x, double y);
173 extern double	y0(double x);
174 extern double	y1(double x);
175 extern double	yn(int x, double y);
176 
177 /* other stuff as defined in BeOS */
178 extern int		isinff(float value);
179 extern int		finitef(float value);
180 extern float	infnanf(int error);
181 extern float	dremf(float x, float y);
182 extern float	significandf(float x);
183 extern float	copysignf(float x, float y);
184 extern int		isnanf(float value);
185 extern double	significand(double x);
186 extern double	copysign(double x, double y);
187 extern double	scalbn(double x, int y);
188 extern double	drem(double x, double y);
189 extern int		isnan(double x);
190 extern int		isfinite(double x);
191 extern int		finite(double x);
192 extern float	j0f(float x);
193 extern float	j1f(float x);
194 extern float	jnf(int x, float y);
195 extern float	y0f(float x);
196 extern float	y1f(float x);
197 extern float	ynf(int x, float y);
198 extern float	erff(float x);
199 extern float	erfcf(float x);
200 extern float	gammaf_r(float x, int *y);
201 extern float	lgammaf_r(float x, int *y);
202 extern float	rintf(float x);
203 extern float	nextafterf(float x, float y);
204 extern float	remainderf(float x, float y);
205 extern float	scalbf(float x, float n);
206 extern float	scalbnf(float x, int n);
207 extern int		ilogbf(float x);
208 
209 /* prototypes for functions used in the macros below */
210 extern int		__fpclassifyf(float value);
211 extern int		__signbitf(float value);
212 extern int		__finitef(float value);
213 extern int		__isnanf(float value);
214 extern int		__isinff(float value);
215 
216 extern int		__fpclassifyl(long double value);
217 extern int		__signbitl(long double value);
218 extern int		__finitel(long double value);
219 extern int		__isnanl(long double value);
220 extern int		__isinfl(long double value);
221 
222 extern int		__fpclassify(double value);
223 extern int		__signbit(double value);
224 extern int		__finite(double value);
225 extern int		__isnan(double value);
226 extern int		__isinf(double value);
227 
228 /* returns number of classification appropriate for 'value' */
229 #define fpclassify(value) \
230 	(sizeof(value) == sizeof(float) ? __fpclassifyf(value)		\
231 		: sizeof(value) == sizeof(double) ? __fpclassify(value)	\
232 		: __fpclassifyl(value))
233 
234 /* returns non-zero if 'value' is negative */
235 # define signbit(value) \
236 	(sizeof(value) == sizeof(float) ? __signbitf(value)			\
237 		: sizeof(value) == sizeof(double) ? __signbit(value)	\
238 		: __signbitl(value))
239 
240 /* returns non-zero if 'value' is not Inf or NaN */
241 # define isfinite(value) \
242 	(sizeof(value) == sizeof(float) ? __finitef(value)			\
243 		: sizeof(value) == sizeof(double) ? __finite(value)		\
244 		: __finitel(value))
245 
246 /* returns non-zero if 'value' is neither zero, sub-normal, Inf, nor NaN */
247 # define isnormal(value) \
248 	(fpclassify(value) == FP_NORMAL)
249 
250 /* returns non-zero if 'value' is NaN */
251 # define isnan(value) \
252 	(sizeof(value) == sizeof(float) ? __isnanf(value)			\
253 		: sizeof(value) == sizeof(double) ? __isnan(value)		\
254 		: __isnanl(value))
255 
256 /* returns non-zero if 'value is Inf */
257 # define isinf(value) \
258 	(sizeof(value) == sizeof(float) ? __isinff(value)			\
259 		: sizeof(value) == sizeof(double) ? __isinf(value)		\
260 		: __isinfl(value))
261 
262 #ifdef __cplusplus
263 }
264 #endif
265 
266 #endif	/* _MATH_H_ */
267