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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since bbe5e34 was 516e780, checked in by GitHub <noreply@…>, 7 years ago

Strip down libmath. (#45)

libmath is mostly unused (except for trunc(), sin() and cos()), and most functions in it are either very imprecise or downright broken. Additionally, it is implemented in manner that conflicts with C standard. Instead of trying to fix all the shortcomings while maintaining unused functionality, I'm opting to simply remove most of it and only keep the parts that are currently necessary.

Later readdition of the removed functions is possible, but there needs to be a reliable way to evaluate their quality first.

  • Property mode set to 100644
File size: 10.1 KB
RevLine 
[516e780]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#endif
53
54#if FLT_EVAL_METHOD == 0
55typedef float float_t;
56typedef double double_t;
57#elif FLT_EVAL_METHOD == 1
58typedef double float_t;
59typedef double double_t;
60#elif FLT_EVAL_METHOD == 2
61typedef long double float_t;
62typedef long double double_t;
63#else
64#error Unknown FLT_EVAL_METHOD value.
65#endif
66
67#define FP_ILOGB0 INT_MIN
68#define FP_ILOGBNAN INT_MAX
69
70#define FP_NAN 0
71#define FP_INFINITE 1
72#define FP_NORMAL 2
73#define FP_SUBNORMAL 3
74#define FP_ZERO 4
75
76int __fpclassify(size_t, ...);
77int __signbit(size_t, ...);
78int __fcompare(size_t, size_t, ...);
79
80#define __FCOMPARE_EQUAL 1
81#define __FCOMPARE_LESS 2
82#define __FCOMPARE_GREATER 4
83
84#if defined(__GNUC__) || defined(__clang__)
85
86#define HUGE_VALF __builtin_huge_valf()
87#define HUGE_VAL __builtin_huge_val()
88#define HUGE_VALL __builtin_huge_vall()
89#define INFINITY __builtin_inff()
90#define NAN __builtin_nan("")
91
92#define fpclassify(x) __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, (x))
93#define isfinite(x) __builtin_isfinite(x)
94#define isinf(x) __builtin_isinf(x)
95#define isnan(x) __builtin_isnan(x)
96#define isnormal(x) __builtin_isnormal(x)
97#define signbit(x) __builtin_signbit(x)
98
99#define isgreater(x, y) __builtin_isgreater(x, y)
100#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
101#define isless(x, y) __builtin_isless(x, y)
102#define islessequal(x, y) __builtin_islessequal(x, y)
103#define islessgreater(x, y) __builtin_islessgreater(x, y)
104#define isunordered(x, y) __builtin_isunordered(x, y)
105
106#else /* defined(__GNUC__) || defined(__clang__) */
107
108#define HUGE_VALF (1.0f / 0.0f)
109#define HUGE_VAL (1.0 / 0.0)
110#define HUGE_VALL (1.0l / 0.0l)
111#define INFINITY (1.0f / 0.0f)
112#define NAN (0.0 / 0.0)
113
114#define fpclassify(x) __fpclassify(sizeof(x), (x))
115#define isfinite(x) (fpclassify(x) > FP_INFINITE)
116#define isinf(x) (fpclassify(x) == FP_INFINITE)
117#define isnan(x) (fpclassify(x) == FP_NAN)
118#define isnormal(x) (fpclassify(x) == FP_NORMAL)
119#define signbit(x) __signbit(sizeof(x), (x))
120
121#define isgreater(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & __FCOMPARE_GREATER))
122#define isgreaterequal(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & (__FCOMPARE_GREATER | __FCOMPARE_EQUAL))))
123#define isless(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & __FCOMPARE_LESS))
124#define islessequal(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & (__FCOMPARE_LESS | __FCOMPARE_EQUAL)))
125#define islessgreater(x, y) (!!(__fcompare(sizeof(x), sizeof(y), (x), (y)) & (__FCOMPARE_LESS | __FCOMPARE_GREATER)))
126#define isunordered(x, y) (!__fcompare(sizeof(x), sizeof(y), (x), (y)))
127
128#endif /* defined(__GNUC__) || defined(__clang__) */
129
130
131#define MATH_ERRNO 1
132#define MATH_ERREXCEPT 2
133
134#define math_errhandling MATH_ERRNO
135
136double acos(double);
137float acosf(float);
138long double acosl(long double);
139double asin(double);
140float asinf(float);
141long double asinl(long double);
142double atan(double);
143float atanf(float);
144long double atanl(long double);
145double atan2(double, double);
146float atan2f(float, float);
147long double atan2l(long double, long double);
148double cos(double);
149float cosf(float);
150long double cosl(long double);
151double sin(double);
152float sinf(float);
153long double sinl(long double);
154double tan(double);
155float tanf(float);
156long double tanl(long double);
157double acosh(double);
158float acoshf(float);
159long double acoshl(long double);
160double asinh(double);
161float asinhf(float);
162long double asinhl(long double);
163double atanh(double);
164float atanhf(float);
165long double atanhl(long double);
166double cosh(double);
167float coshf(float);
168long double coshl(long double);
169double sinh(double);
170float sinhf(float);
171long double sinhl(long double);
172double tanh(double);
173float tanhf(float);
174long double tanhl(long double);
175double exp(double);
176float expf(float);
177long double expl(long double);
178double exp2(double);
179float exp2f(float);
180long double exp2l(long double);
181double expm1(double);
182float expm1f(float);
183long double expm1l(long double);
184double frexp(double, int *);
185float frexpf(float, int *);
186long double frexpl(long double, int *);
187int ilogb(double);
188int ilogbf(float);
189int ilogbl(long double);
190double ldexp(double, int);
191float ldexpf(float, int);
192long double ldexpl(long double, int);
193double log(double);
194float logf(float);
195long double logl(long double);
196double log10(double);
197float log10f(float);
198long double log10l(long double);
199double log1p(double);
200float log1pf(float);
201long double log1pl(long double);
202double log2(double);
203float log2f(float);
204long double log2l(long double);
205double logb(double);
206float logbf(float);
207long double logbl(long double);
208double modf(double value, double *);
209float modff(float value, float *);
210long double modfl(long double, long double *);
211double scalbn(double, int);
212float scalbnf(float, int);
213long double scalbnl(long double, int);
214double scalbln(double, long int);
215float scalblnf(float, long int);
216long double scalblnl(long double, long int);
217double cbrt(double);
218float cbrtf(float);
219long double cbrtl(long double);
220double fabs(double);
221float fabsf(float);
222long double fabsl(long double);
223double hypot(double, double);
224float hypotf(float, float);
225long double hypotl(long double, long double);
226double pow(double, double);
227float powf(float, float);
228long double powl(long double, long double);
229double sqrt(double);
230float sqrtf(float);
231long double sqrtl(long double);
232double erf(double);
233float erff(float);
234long double erfl(long double);
235double erfc(double);
236float erfcf(float);
237long double erfcl(long double);
238double lgamma(double);
239float lgammaf(float);
240long double lgammal(long double);
241double tgamma(double);
242float tgammaf(float);
243long double tgammal(long double);
244double ceil(double);
245float ceilf(float);
246long double ceill(long double);
247double floor(double);
248float floorf(float);
249long double floorl(long double);
250double nearbyint(double);
251float nearbyintf(float);
252long double nearbyintl(long double);
253double rint(double);
254float rintf(float);
255long double rintl(long double);
256long int lrint(double);
257long int lrintf(float);
258long int lrintl(long double);
259long long int llrint(double);
260long long int llrintf(float);
261long long int llrintl(long double);
262double round(double);
263float roundf(float);
264long double roundl(long double);
265long int lround(double);
266long int lroundf(float);
267long int lroundl(long double);
268long long int llround(double);
269long long int llroundf(float);
270long long int llroundl(long double);
271double trunc(double);
272float truncf(float);
273long double truncl(long double);
274double fmod(double, double);
275float fmodf(float, float);
276long double fmodl(long double, long double);
277double remainder(double, double);
278float remainderf(float, float);
279long double remainderl(long double, long double);
280double remquo(double, double, int *);
281float remquof(float, float, int *);
282long double remquol(long double, long double, int *);
283double copysign(double, double);
284float copysignf(float, float);
285long double copysignl(long double, long double);
286double nan(const char *);
287float nanf(const char *);
288long double nanl(const char *);
289double nextafter(double, double);
290float nextafterf(float, float);
291long double nextafterl(long double, long double);
292double nexttoward(double, long double);
293float nexttowardf(float, long double);
294long double nexttowardl(long double, long double);
295double fdim(double, double);
296float fdimf(float, float);
297long double fdiml(long double, long double);
298double fmax(double, double);
299float fmaxf(float, float);
300long double fmaxl(long double, long double);
301double fmin(double, double);
302float fminf(float, float);
303long double fminl(long double, long double);
304double fma(double, double, double);
305float fmaf(float, float, float);
306long double fmal(long double, long double, long double);
307
308#if defined(__GNUC__) || defined(__clang__)
309
310#define copysign __builtin_copysign
311#define copysignf __builtin_copysignf
312#define copysignl __builtin_copysignl
313
314#define nextafter __builtin_nextafter
315#define nextafterf __builtin_nextafterf
316#define nextafterl __builtin_nextafterl
317
318#endif
319
320#endif /* _MATH_H */
321
Note: See TracBrowser for help on using the repository browser.