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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b2aaaa0 was 58e7b26, checked in by Jiří Zárevúcky <jiri.zarevucky@…>, 7 years ago

Make uspace hosted.

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