]> sourceware.org Git - glibc.git/blame - math/math.h
Update.
[glibc.git] / math / math.h
CommitLineData
f7eac6eb 1/* Declarations for math functions.
2f6d1f1b 2 Copyright (C) 1991, 92, 93, 95, 96, 97 Free Software Foundation, Inc.
ba1ffaa1 3 This file is part of the GNU C Library.
28f540f4 4
ba1ffaa1
UD
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
28f540f4 9
ba1ffaa1
UD
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
28f540f4 14
ba1ffaa1
UD
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
28f540f4
RM
19
20/*
ba1ffaa1 21 * ISO C Standard: 4.5 MATHEMATICS <math.h>
28f540f4
RM
22 */
23
24#ifndef _MATH_H
28f540f4 25#define _MATH_H 1
5107cf1d 26
28f540f4
RM
27#include <features.h>
28
29__BEGIN_DECLS
30
f7eac6eb
RM
31/* Get machine-dependent HUGE_VAL value (returned on overflow).
32 On all IEEE754 machines, this is +Infinity. */
5107cf1d 33#include <bits/huge_val.h>
28f540f4
RM
34
35/* Get machine-dependent NAN value (returned for some domain errors). */
36#ifdef __USE_GNU
478b92f0 37# include <bits/nan.h>
28f540f4
RM
38#endif
39
40
5107cf1d
UD
41/* The file <bits/mathcalls.h> contains the prototypes for all the
42 actual math functions. These macros are used for those prototypes,
43 so we can easily declare each function as both `name' and `__name',
f7eac6eb
RM
44 and can declare the float versions `namef' and `__namef'. */
45
46#define __MATHCALL(function,suffix, args) \
377a515b 47 __MATHDECL (_Mdouble_,function,suffix, args)
f7eac6eb
RM
48#define __MATHDECL(type, function,suffix, args) \
49 __MATHDECL_1(type, function,suffix, args); \
377a515b 50 __MATHDECL_1(type, __CONCAT(__,function),suffix, args)
3e5f5557
UD
51#define __MATHCALLX(function,suffix, args, attrib) \
52 __MATHDECLX (_Mdouble_,function,suffix, args, attrib)
53#define __MATHDECLX(type, function,suffix, args, attrib) \
54 __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
55 __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib)
f7eac6eb
RM
56#define __MATHDECL_1(type, function,suffix, args) \
57 extern type __MATH_PRECNAME(function,suffix) args
58
59#define _Mdouble_ double
377a515b 60#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
5107cf1d 61#include <bits/mathcalls.h>
f7eac6eb
RM
62#undef _Mdouble_
63#undef __MATH_PRECNAME
64
377a515b 65#if defined __USE_MISC || defined __USE_ISOC9X
76060ec0 66
999493cb
RM
67
68/* Include the file of declarations again, this time using `float'
f7eac6eb
RM
69 instead of `double' and appending f to each function name. */
70
999493cb 71#ifndef _Mfloat_
478b92f0 72# define _Mfloat_ float
999493cb
RM
73#endif
74#define _Mdouble_ _Mfloat_
377a515b 75#ifdef __STDC__
478b92f0 76# define __MATH_PRECNAME(name,r) name##f##r
377a515b 77#else
478b92f0 78# define __MATH_PRECNAME(name,r) name/**/f/**/r
377a515b 79#endif
5107cf1d 80#include <bits/mathcalls.h>
f7eac6eb
RM
81#undef _Mdouble_
82#undef __MATH_PRECNAME
76060ec0 83
377a515b 84#if __STDC__ - 0 || __GNUC__ - 0
999493cb 85/* Include the file of declarations again, this time using `long double'
76060ec0
RM
86 instead of `double' and appending l to each function name. */
87
478b92f0
UD
88# ifndef _Mlong_double_
89# define _Mlong_double_ long double
90# endif
91# define _Mdouble_ _Mlong_double_
92# ifdef __STDC__
93# define __MATH_PRECNAME(name,r) name##l##r
94# else
95# define __MATH_PRECNAME(name,r) name/**/l/**/r
96# endif
97# include <bits/mathcalls.h>
98# undef _Mdouble_
99# undef __MATH_PRECNAME
76060ec0 100
377a515b
UD
101#endif /* __STDC__ || __GNUC__ */
102
103#endif /* Use misc or ISO C 9X. */
4cca6b86
UD
104#undef __MATHDECL_1
105#undef __MATHDECL
106#undef __MATHCALL
107
108
109#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC9X
110/* This variable is used by `gamma' and `lgamma'. */
111extern int signgam;
112#endif
377a515b
UD
113
114
115/* ISO C 9X defines some generic macros which work on any data type. */
116#if __USE_ISOC9X
117
63551311
UD
118/* Get the architecture specific values describing the floating-point
119 evaluation. The following symbols will get defined:
120
121 float_t floating-point type at least as wide as `float' used
122 to evaluate `float' expressions
123 double_t floating-point type at least as wide as `double' used
124 to evaluate `double' expressions
125
126 FLT_EVAL_METHOD
127 Defined to
128 0 if `float_t' is `float' and `double_t' is `double'
129 1 if `float_t' and `double_t' are `double'
130 2 if `float_t' and `double_t' are `long double'
131 else `float_t' and `double_t' are unspecified
132
133 INFINITY representation of the infinity value of type `float_t'
134*/
478b92f0 135# include <bits/mathdef.h>
63551311 136
377a515b
UD
137/* All floating-point numbers can be put in one of these categories. */
138enum
139 {
140 FP_NAN,
478b92f0 141# define FP_NAN FP_NAN
377a515b 142 FP_INFINITE,
478b92f0 143# define FP_INFINITE FP_INFINITE
377a515b 144 FP_ZERO,
478b92f0 145# define FP_ZERO FP_ZERO
377a515b 146 FP_SUBNORMAL,
478b92f0 147# define FP_SUBNORMAL FP_SUBNORMAL
377a515b 148 FP_NORMAL
478b92f0 149# define FP_NORMAL FP_NORMAL
377a515b
UD
150 };
151
152/* Return number of classification appropriate for X. */
478b92f0 153# define fpclassify(x) \
377a515b 154 (sizeof (x) == sizeof (float) ? \
63551311 155 __fpclassifyf (x) \
377a515b 156 : sizeof (x) == sizeof (double) ? \
0d8733c4 157 __fpclassify (x) : __fpclassifyl (x))
377a515b
UD
158
159/* Return nonzero value if sign of X is negative. */
478b92f0 160# define signbit(x) \
377a515b
UD
161 (sizeof (x) == sizeof (float) ? \
162 __signbitf (x) \
163 : sizeof (x) == sizeof (double) ? \
164 __signbit (x) : __signbitl (x))
165
166/* Return nonzero value if X is not +-Inf or NaN. */
478b92f0 167# define isfinite(x) \
63551311
UD
168 (sizeof (x) == sizeof (float) ? \
169 __finitef (x) \
170 : sizeof (x) == sizeof (double) ? \
171 __finite (x) : __finitel (x))
377a515b
UD
172
173/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
478b92f0 174# define isnormal(x) (fpclassify (x) == FP_NORMAL)
377a515b
UD
175
176/* Return nonzero value if X is a NaN. We could use `fpclassify' but
177 we already have this functions `__isnan' and it is faster. */
478b92f0 178# define isnan(x) \
377a515b
UD
179 (sizeof (x) == sizeof (float) ? \
180 __isnanf (x) \
181 : sizeof (x) == sizeof (double) ? \
182 __isnan (x) : __isnanl (x))
28f540f4 183
28f540f4 184
377a515b
UD
185/* Conversion functions. */
186
187/* Round X to nearest integral value according to current rounding
188 direction. */
d705269e
UD
189extern long int lrint __P ((long double __x));
190extern long long int llrint __P ((long double __x));
377a515b
UD
191
192/* Round X to nearest integral value, rounding halfway cases away from
193 zero. */
d705269e
UD
194extern long int lround __P ((long double __x));
195extern long long int llround __P ((long double __x));
377a515b 196
377a515b
UD
197#endif /* Use ISO C 9X. */
198
28f540f4 199#ifdef __USE_MISC
f7eac6eb 200/* Support for various different standard error handling behaviors. */
28f540f4 201
f7eac6eb 202typedef enum { _IEEE_ = -1, _SVID_, _XOPEN_, _POSIX_ } _LIB_VERSION_TYPE;
28f540f4 203
f7eac6eb
RM
204/* This variable can be changed at run-time to any of the values above to
205 affect floating point error handling behavior (it may also be necessary
206 to change the hardware FPU exception settings). */
207extern _LIB_VERSION_TYPE _LIB_VERSION;
28f540f4
RM
208#endif
209
210
ceb2d9aa 211#ifdef __USE_SVID
f7eac6eb 212/* In SVID error handling, `matherr' is called with this description
2f6d1f1b
UD
213 of the exceptional condition.
214
215 We have a problem when using C++ since `exception' is reserved in
216 C++. */
478b92f0 217# ifdef __cplusplus
ceb2d9aa 218struct __exception
478b92f0 219# else
f7eac6eb 220struct exception
478b92f0 221# endif
f7eac6eb
RM
222 {
223 int type;
224 char *name;
225 double arg1;
226 double arg2;
227 double retval;
228 };
28f540f4 229
478b92f0
UD
230# ifdef __cplusplus
231extern int __matherr __P ((struct __exception *__exc));
232extern int matherr __P ((struct __exception *__exc));
233# else
234extern int __matherr __P ((struct exception *__exc));
235extern int matherr __P ((struct exception *__exc));
236# endif
28f540f4 237
478b92f0 238# define X_TLOSS 1.41484755040568800000e+16
28f540f4 239
f7eac6eb 240/* Types of exceptions in the `type' field. */
478b92f0
UD
241# define DOMAIN 1
242# define SING 2
243# define OVERFLOW 3
244# define UNDERFLOW 4
245# define TLOSS 5
246# define PLOSS 6
28f540f4 247
f7eac6eb 248/* SVID mode specifies returning this large value instead of infinity. */
478b92f0
UD
249# define HUGE FLT_MAX
250# include <float.h> /* Defines FLT_MAX. */
28f540f4 251
377a515b
UD
252#else /* !SVID */
253
478b92f0 254# ifdef __USE_XOPEN
377a515b 255/* X/Open wants another strange constant. */
478b92f0
UD
256# define MAXFLOAT FLT_MAX
257# include <float.h>
258# endif
377a515b 259
ceb2d9aa 260#endif /* SVID */
28f540f4 261
28f540f4 262
28f540f4 263#ifdef __USE_BSD
710f7bab 264
28f540f4 265/* Some useful constants. */
478b92f0
UD
266# define M_E _Mldbl(2.7182818284590452354) /* e */
267# define M_LOG2E _Mldbl(1.4426950408889634074) /* log 2e */
268# define M_LOG10E _Mldbl(0.43429448190325182765) /* log 10e */
269# define M_LN2 _Mldbl(0.69314718055994530942) /* log e2 */
270# define M_LN10 _Mldbl(2.30258509299404568402) /* log e10 */
271# define M_PI _Mldbl(3.14159265358979323846) /* pi */
272# define M_PI_2 _Mldbl(1.57079632679489661923) /* pi/2 */
273# define M_PI_4 _Mldbl(0.78539816339744830962) /* pi/4 */
274# define M_1_PI _Mldbl(0.31830988618379067154) /* 1/pi */
275# define M_2_PI _Mldbl(0.63661977236758134308) /* 2/pi */
276# define M_2_SQRTPI _Mldbl(1.12837916709551257390) /* 2/sqrt(pi) */
277# define M_SQRT2 _Mldbl(1.41421356237309504880) /* sqrt(2) */
278# define M_SQRT1_2 _Mldbl(0.70710678118654752440) /* 1/sqrt(2) */
710f7bab 279
714a562f
UD
280#endif
281
710f7bab
RM
282/* Our constants might specify more precision than `double' can represent.
283 Use `long double' constants in standard and GNU C, where they are
714a562f
UD
284 supported and the cast to `double'.
285
478b92f0
UD
286 If the constants are use in code which does not use prototypes, one
287 might get problems if a function takes a `double' argument and any
288 of the constants are provided as the argument. In this case, cast
289 the argument to `double'.
290
291 Please note we define the macro even if the constants are not defined.
714a562f 292 This helps us to use the macros in other places. */
710f7bab 293#if __STDC__ - 0 || __GNUC__ - 0
478b92f0 294# define _Mldbl(x) x##L
710f7bab 295#else /* Traditional C. */
478b92f0 296# define _Mldbl(x) x
710f7bab
RM
297#endif /* Standard or GNU C. */
298
28f540f4 299
4d585333 300/* Get machine-dependent inline versions (if there are any). */
907a1bac 301#ifdef __OPTIMIZE__
478b92f0 302# include <bits/mathinline.h>
4d585333
RM
303#endif
304
305
ae1025be
UD
306#if __USE_ISOC9X
307/* ISO C 9X defines some macros to compare number while taking care
308 for unordered numbers. Since many FPUs provide special
907a1bac
UD
309 instructions to support these operations and these tests are
310 defined in <bits/mathinline.h>, we define the generic macros at
311 this late point. */
ae1025be
UD
312
313/* Return nonzero value if X is greater than Y. */
314# ifndef isgreater
315# define isgreater(x, y) (!isunordered ((x), (y)) && (x) > (y))
316# endif
317
318/* Return nonzero value if X is greater than or equal to Y. */
319# ifndef isgreaterequal
320# define isgreaterequal(x, y) (!isunordered ((x), (y)) && (x) >= (y))
321# endif
322
323/* Return nonzero value if X is less than Y. */
324# ifndef isless
325# define isless(x, y) (!isunordered ((x), (y)) && (x) < (y))
326# endif
327
328/* Return nonzero value if X is less than or equal to Y. */
329# ifndef islessequal
330# define islessequal(x, y) (!isunordered ((x), (y)) && (x) <= (y))
331# endif
332
333/* Return nonzero value if either X is less than Y or Y is less than X. */
334# ifndef islessgreater
335# define islessgreater(x, y) \
336 (!isunordered ((x), (y)) && ((x) < (y) || (y) < (x)))
337# endif
338
339/* Return nonzero value if arguments are unordered. */
340# ifndef isunordered
341# define isunordered(x, y) \
342 (fpclassify (x) == FP_NAN || fpclassify (y) == FP_NAN)
343# endif
344
345#endif
346
4d585333
RM
347__END_DECLS
348
349
28f540f4 350#endif /* math.h */
This page took 0.094469 seconds and 5 git commands to generate.