source: mainline/uspace/lib/c/include/math.h@ cd1e3fc0

Last change on this file since cd1e3fc0 was d7f7a4a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Replace some license headers with SPDX identifier

Headers are replaced using tools/transorm-copyright.sh only
when it can be matched verbatim with the license header used
throughout most of the codebase.

  • Property mode set to 100644
File size: 8.9 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2018 CZ.NIC, z.s.p.o.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _MATH_H
8#define _MATH_H
9
10#include <limits.h>
11#include <stddef.h>
12#include <float.h>
13
14#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_HELENOS_SOURCE)
15
16#define M_E 2.7182818284590452354
17#define M_LOG2E 1.4426950408889634074
18#define M_LOG10E 0.43429448190325182765
19#define M_LN2 0.69314718055994530942
20#define M_LN10 2.30258509299404568402
21#define M_PI 3.14159265358979323846
22#define M_PI_2 1.57079632679489661923
23#define M_PI_4 0.78539816339744830962
24#define M_1_PI 0.31830988618379067154
25#define M_2_PI 0.63661977236758134308
26#define M_2_SQRTPI 1.12837916709551257390
27#define M_SQRT2 1.41421356237309504880
28#define M_SQRT1_2 0.70710678118654752440
29
30/* GNU extensions, but GCC emits calls to them as an optimization. */
31void sincos(double, double *, double *);
32void sincosf(float, float *, float *);
33void sincosl(long double, long double *, long double *);
34
35#endif
36
37#if FLT_EVAL_METHOD == 0
38typedef float float_t;
39typedef double double_t;
40#elif FLT_EVAL_METHOD == 1
41typedef double float_t;
42typedef double double_t;
43#elif FLT_EVAL_METHOD == 2
44typedef long double float_t;
45typedef long double double_t;
46#else
47#error Unknown FLT_EVAL_METHOD value.
48#endif
49
50#define FP_ILOGB0 INT_MIN
51#define FP_ILOGBNAN INT_MAX
52
53#define FP_NAN 0
54#define FP_INFINITE 1
55#define FP_NORMAL 2
56#define FP_SUBNORMAL 3
57#define FP_ZERO 4
58
59int __fpclassify(size_t, ...);
60int __signbit(size_t, ...);
61int __fcompare(size_t, size_t, ...);
62
63#define __FCOMPARE_EQUAL 1
64#define __FCOMPARE_LESS 2
65#define __FCOMPARE_GREATER 4
66
67#if defined(__GNUC__) || defined(__clang__)
68
69#define HUGE_VALF __builtin_huge_valf()
70#define HUGE_VAL __builtin_huge_val()
71#define HUGE_VALL __builtin_huge_vall()
72#define INFINITY __builtin_inff()
73#define NAN __builtin_nan("")
74
75#define fpclassify(x) __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, (x))
76#define isfinite(x) __builtin_isfinite(x)
77#define isinf(x) __builtin_isinf(x)
78#define isnan(x) __builtin_isnan(x)
79#define isnormal(x) __builtin_isnormal(x)
80#define signbit(x) __builtin_signbit(x)
81
82#define isgreater(x, y) __builtin_isgreater(x, y)
83#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
84#define isless(x, y) __builtin_isless(x, y)
85#define islessequal(x, y) __builtin_islessequal(x, y)
86#define islessgreater(x, y) __builtin_islessgreater(x, y)
87#define isunordered(x, y) __builtin_isunordered(x, y)
88
89#else /* defined(__GNUC__) || defined(__clang__) */
90
91#define HUGE_VALF (1.0f / 0.0f)
92#define HUGE_VAL (1.0 / 0.0)
93#define HUGE_VALL (1.0l / 0.0l)
94#define INFINITY (1.0f / 0.0f)
95#define NAN (0.0 / 0.0)
96
97#define fpclassify(x) __fpclassify(sizeof(x), (x))
98#define isfinite(x) (fpclassify(x) > FP_INFINITE)
99#define isinf(x) (fpclassify(x) == FP_INFINITE)
100#define isnan(x) (fpclassify(x) == FP_NAN)
101#define isnormal(x) (fpclassify(x) == FP_NORMAL)
102#define signbit(x) __signbit(sizeof(x), (x))
103
104#define isgreater(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & __FCOMPARE_GREATER))
105#define isgreaterequal(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & (__FCOMPARE_GREATER | __FCOMPARE_EQUAL))))
106#define isless(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & __FCOMPARE_LESS))
107#define islessequal(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & (__FCOMPARE_LESS | __FCOMPARE_EQUAL)))
108#define islessgreater(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & (__FCOMPARE_LESS | __FCOMPARE_GREATER)))
109#define isunordered(x, y) (!__fcompare(sizeof(x), sizeof(y), (x), (y)))
110
111#endif /* defined(__GNUC__) || defined(__clang__) */
112
113#define MATH_ERRNO 1
114#define MATH_ERREXCEPT 2
115
116#define math_errhandling MATH_ERRNO
117
118double acos(double);
119float acosf(float);
120long double acosl(long double);
121double asin(double);
122float asinf(float);
123long double asinl(long double);
124double atan(double);
125float atanf(float);
126long double atanl(long double);
127double atan2(double, double);
128float atan2f(float, float);
129long double atan2l(long double, long double);
130double cos(double);
131float cosf(float);
132long double cosl(long double);
133double sin(double);
134float sinf(float);
135long double sinl(long double);
136double tan(double);
137float tanf(float);
138long double tanl(long double);
139double acosh(double);
140float acoshf(float);
141long double acoshl(long double);
142double asinh(double);
143float asinhf(float);
144long double asinhl(long double);
145double atanh(double);
146float atanhf(float);
147long double atanhl(long double);
148double cosh(double);
149float coshf(float);
150long double coshl(long double);
151double sinh(double);
152float sinhf(float);
153long double sinhl(long double);
154double tanh(double);
155float tanhf(float);
156long double tanhl(long double);
157double exp(double);
158float expf(float);
159long double expl(long double);
160double exp2(double);
161float exp2f(float);
162long double exp2l(long double);
163double expm1(double);
164float expm1f(float);
165long double expm1l(long double);
166double frexp(double, int *);
167float frexpf(float, int *);
168long double frexpl(long double, int *);
169int ilogb(double);
170int ilogbf(float);
171int ilogbl(long double);
172double ldexp(double, int);
173float ldexpf(float, int);
174long double ldexpl(long double, int);
175double log(double);
176float logf(float);
177long double logl(long double);
178double log10(double);
179float log10f(float);
180long double log10l(long double);
181double log1p(double);
182float log1pf(float);
183long double log1pl(long double);
184double log2(double);
185float log2f(float);
186long double log2l(long double);
187double logb(double);
188float logbf(float);
189long double logbl(long double);
190double modf(double value, double *);
191float modff(float value, float *);
192long double modfl(long double, long double *);
193double scalbn(double, int);
194float scalbnf(float, int);
195long double scalbnl(long double, int);
196double scalbln(double, long int);
197float scalblnf(float, long int);
198long double scalblnl(long double, long int);
199double cbrt(double);
200float cbrtf(float);
201long double cbrtl(long double);
202double fabs(double);
203float fabsf(float);
204long double fabsl(long double);
205double hypot(double, double);
206float hypotf(float, float);
207long double hypotl(long double, long double);
208double pow(double, double);
209float powf(float, float);
210long double powl(long double, long double);
211double sqrt(double);
212float sqrtf(float);
213long double sqrtl(long double);
214double erf(double);
215float erff(float);
216long double erfl(long double);
217double erfc(double);
218float erfcf(float);
219long double erfcl(long double);
220double lgamma(double);
221float lgammaf(float);
222long double lgammal(long double);
223double tgamma(double);
224float tgammaf(float);
225long double tgammal(long double);
226double ceil(double);
227float ceilf(float);
228long double ceill(long double);
229double floor(double);
230float floorf(float);
231long double floorl(long double);
232double nearbyint(double);
233float nearbyintf(float);
234long double nearbyintl(long double);
235double rint(double);
236float rintf(float);
237long double rintl(long double);
238long int lrint(double);
239long int lrintf(float);
240long int lrintl(long double);
241long long int llrint(double);
242long long int llrintf(float);
243long long int llrintl(long double);
244double round(double);
245float roundf(float);
246long double roundl(long double);
247long int lround(double);
248long int lroundf(float);
249long int lroundl(long double);
250long long int llround(double);
251long long int llroundf(float);
252long long int llroundl(long double);
253double trunc(double);
254float truncf(float);
255long double truncl(long double);
256double fmod(double, double);
257float fmodf(float, float);
258long double fmodl(long double, long double);
259double remainder(double, double);
260float remainderf(float, float);
261long double remainderl(long double, long double);
262double remquo(double, double, int *);
263float remquof(float, float, int *);
264long double remquol(long double, long double, int *);
265double copysign(double, double);
266float copysignf(float, float);
267long double copysignl(long double, long double);
268double nan(const char *);
269float nanf(const char *);
270long double nanl(const char *);
271double nextafter(double, double);
272float nextafterf(float, float);
273long double nextafterl(long double, long double);
274double nexttoward(double, long double);
275float nexttowardf(float, long double);
276long double nexttowardl(long double, long double);
277double fdim(double, double);
278float fdimf(float, float);
279long double fdiml(long double, long double);
280double fmax(double, double);
281float fmaxf(float, float);
282long double fmaxl(long double, long double);
283double fmin(double, double);
284float fminf(float, float);
285long double fminl(long double, long double);
286double fma(double, double, double);
287float fmaf(float, float, float);
288long double fmal(long double, long double, long double);
289
290#if defined(__GNUC__) || defined(__clang__)
291
292#define copysign __builtin_copysign
293#define copysignf __builtin_copysignf
294#define copysignl __builtin_copysignl
295
296#define nextafter __builtin_nextafter
297#define nextafterf __builtin_nextafterf
298#define nextafterl __builtin_nextafterl
299
300#endif
301
302#endif /* _MATH_H */
Note: See TracBrowser for help on using the repository browser.