modernc.org/cc@v1.0.1/v2/headers/linux_amd64/usr/include/math.h (about) 1 /* Declarations for math functions. 2 Copyright (C) 1991-2015 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 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 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <http://www.gnu.org/licenses/>. */ 18 19 /* 20 * ISO C99 Standard: 7.12 Mathematics <math.h> 21 */ 22 23 #ifndef _MATH_H 24 #define _MATH_H 1 25 26 #include <features.h> 27 28 __BEGIN_DECLS 29 /* Get machine-dependent vector math functions declarations. */ 30 #include <bits/math-vector.h> 31 /* Get machine-dependent HUGE_VAL value (returned on overflow). 32 On all IEEE754 machines, this is +Infinity. */ 33 #include <bits/huge_val.h> 34 #ifdef __USE_ISOC99 35 # include <bits/huge_valf.h> 36 # include <bits/huge_vall.h> 37 /* Get machine-dependent INFINITY value. */ 38 # include <bits/inf.h> 39 /* Get machine-dependent NAN value (returned for some domain errors). */ 40 # include <bits/nan.h> 41 #endif /* __USE_ISOC99 */ 42 /* Get general and ISO C99 specific information. */ 43 #include <bits/mathdef.h> 44 /* The file <bits/mathcalls.h> contains the prototypes for all the 45 actual math functions. These macros are used for those prototypes, 46 so we can easily declare each function as both `name' and `__name', 47 and can declare the float versions `namef' and `__namef'. */ 48 #define __SIMD_DECL(function) __CONCAT (__DECL_SIMD_, function) 49 #define __MATHCALL_VEC(function, suffix, args) \ 50 __SIMD_DECL (__MATH_PRECNAME (function, suffix)) \ 51 __MATHCALL (function, suffix, args) 52 #define __MATHDECL_VEC(type, function,suffix, args) \ 53 __SIMD_DECL (__MATH_PRECNAME (function, suffix)) \ 54 __MATHDECL(type, function,suffix, args) 55 #define __MATHCALL(function,suffix, args) \ 56 __MATHDECL (_Mdouble_,function,suffix, args) 57 #define __MATHDECL(type, function,suffix, args) \ 58 __MATHDECL_1(type, function,suffix, args); \ 59 __MATHDECL_1(type, __CONCAT(__,function),suffix, args) 60 #define __MATHCALLX(function,suffix, args, attrib) \ 61 __MATHDECLX (_Mdouble_,function,suffix, args, attrib) 62 #define __MATHDECLX(type, function,suffix, args, attrib) \ 63 __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \ 64 __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib) 65 #define __MATHDECL_1(type, function,suffix, args) \ 66 extern type __MATH_PRECNAME(function,suffix) args __THROW 67 #define _Mdouble_ double 68 #define __MATH_PRECNAME(name,r) __CONCAT(name,r) 69 #define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_STD 70 #define _Mdouble_END_NAMESPACE __END_NAMESPACE_STD 71 #include <bits/mathcalls.h> 72 #undef _Mdouble_ 73 #undef _Mdouble_BEGIN_NAMESPACE 74 #undef _Mdouble_END_NAMESPACE 75 #undef __MATH_PRECNAME 76 #ifdef __USE_ISOC99 77 /* Include the file of declarations again, this time using `float' 78 instead of `double' and appending f to each function name. */ 79 # ifndef _Mfloat_ 80 # define _Mfloat_ float 81 # endif 82 # define _Mdouble_ _Mfloat_ 83 # define __MATH_PRECNAME(name,r) name##f##r 84 # define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99 85 # define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99 86 # include <bits/mathcalls.h> 87 # undef _Mdouble_ 88 # undef _Mdouble_BEGIN_NAMESPACE 89 # undef _Mdouble_END_NAMESPACE 90 # undef __MATH_PRECNAME 91 # if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC) \ 92 || defined __LDBL_COMPAT \ 93 || defined _LIBC_TEST 94 # ifdef __LDBL_COMPAT 95 # ifdef __USE_ISOC99 96 extern float __nldbl_nexttowardf(float __x, long double __y) 97 __THROW __attribute__ ((__const__)); 98 # ifdef __REDIRECT_NTH 99 extern float __REDIRECT_NTH(nexttowardf, (float __x, long double __y), __nldbl_nexttowardf) 100 __attribute__ ((__const__)); 101 extern double __REDIRECT_NTH(nexttoward, (double __x, long double __y), nextafter) __attribute__ ((__const__)); 102 extern long double __REDIRECT_NTH(nexttowardl, (long double __x, long double __y), nextafter) __attribute__ ((__const__)); 103 # endif 104 # endif 105 106 # undef __MATHDECL_1 107 # define __MATHDECL_2(type, function,suffix, args, alias) \ 108 extern type __REDIRECT_NTH(__MATH_PRECNAME(function,suffix), \ 109 args, alias) 110 # define __MATHDECL_1(type, function,suffix, args) \ 111 __MATHDECL_2(type, function,suffix, args, __CONCAT(function,suffix)) 112 # endif 113 114 /* Include the file of declarations again, this time using `long double' 115 instead of `double' and appending l to each function name. */ 116 117 # ifndef _Mlong_double_ 118 # define _Mlong_double_ long double 119 # endif 120 # define _Mdouble_ _Mlong_double_ 121 # define __MATH_PRECNAME(name,r) name##l##r 122 # define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99 123 # define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99 124 # define __MATH_DECLARE_LDOUBLE 1 125 # include <bits/mathcalls.h> 126 # undef _Mdouble_ 127 # undef _Mdouble_BEGIN_NAMESPACE 128 # undef _Mdouble_END_NAMESPACE 129 # undef __MATH_PRECNAME 130 131 # endif /* !(__NO_LONG_DOUBLE_MATH && _LIBC) || __LDBL_COMPAT */ 132 133 #endif /* Use ISO C99. */ 134 #undef __MATHDECL_1 135 #undef __MATHDECL 136 #undef __MATHCALL 137 138 #if defined __USE_MISC || defined __USE_XOPEN 139 /* This variable is used by `gamma' and `lgamma'. */ 140 extern int signgam; 141 #endif 142 143 /* ISO C99 defines some generic macros which work on any data type. */ 144 #ifdef __USE_ISOC99 145 146 /* Get the architecture specific values describing the floating-point 147 evaluation. The following symbols will get defined: 148 149 float_t floating-point type at least as wide as `float' used 150 to evaluate `float' expressions 151 double_t floating-point type at least as wide as `double' used 152 to evaluate `double' expressions 153 154 FLT_EVAL_METHOD 155 Defined to 156 0 if `float_t' is `float' and `double_t' is `double' 157 1 if `float_t' and `double_t' are `double' 158 2 if `float_t' and `double_t' are `long double' 159 else `float_t' and `double_t' are unspecified 160 161 INFINITY representation of the infinity value of type `float' 162 163 FP_FAST_FMA 164 FP_FAST_FMAF 165 FP_FAST_FMAL 166 If defined it indicates that the `fma' function 167 generally executes about as fast as a multiply and an add. 168 This macro is defined only iff the `fma' function is 169 implemented directly with a hardware multiply-add instructions. 170 171 FP_ILOGB0 Expands to a value returned by `ilogb (0.0)'. 172 FP_ILOGBNAN Expands to a value returned by `ilogb (NAN)'. 173 174 DECIMAL_DIG Number of decimal digits supported by conversion between 175 decimal and all internal floating-point formats. 176 177 */ 178 179 /* All floating-point numbers can be put in one of these categories. */ 180 enum { 181 FP_NAN = 182 # define FP_NAN 0 183 FP_NAN, 184 FP_INFINITE = 185 # define FP_INFINITE 1 186 FP_INFINITE, 187 FP_ZERO = 188 # define FP_ZERO 2 189 FP_ZERO, 190 FP_SUBNORMAL = 191 # define FP_SUBNORMAL 3 192 FP_SUBNORMAL, 193 FP_NORMAL = 194 # define FP_NORMAL 4 195 FP_NORMAL 196 }; 197 198 /* Return number of classification appropriate for X. */ 199 # ifdef __NO_LONG_DOUBLE_MATH 200 # define fpclassify(x) \ 201 (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x)) 202 # else 203 # define fpclassify(x) \ 204 (sizeof (x) == sizeof (float) \ 205 ? __fpclassifyf (x) \ 206 : sizeof (x) == sizeof (double) \ 207 ? __fpclassify (x) : __fpclassifyl (x)) 208 # endif 209 210 /* Return nonzero value if sign of X is negative. */ 211 # ifdef __NO_LONG_DOUBLE_MATH 212 # define signbit(x) \ 213 (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x)) 214 # else 215 # define signbit(x) \ 216 (sizeof (x) == sizeof (float) \ 217 ? __signbitf (x) \ 218 : sizeof (x) == sizeof (double) \ 219 ? __signbit (x) : __signbitl (x)) 220 # endif 221 222 /* Return nonzero value if X is not +-Inf or NaN. */ 223 # ifdef __NO_LONG_DOUBLE_MATH 224 # define isfinite(x) \ 225 (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x)) 226 # else 227 # define isfinite(x) \ 228 (sizeof (x) == sizeof (float) \ 229 ? __finitef (x) \ 230 : sizeof (x) == sizeof (double) \ 231 ? __finite (x) : __finitel (x)) 232 # endif 233 234 /* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */ 235 # define isnormal(x) (fpclassify (x) == FP_NORMAL) 236 237 /* Return nonzero value if X is a NaN. We could use `fpclassify' but 238 we already have this functions `__isnan' and it is faster. */ 239 # ifdef __NO_LONG_DOUBLE_MATH 240 # define isnan(x) \ 241 (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x)) 242 # else 243 # define isnan(x) \ 244 (sizeof (x) == sizeof (float) \ 245 ? __isnanf (x) \ 246 : sizeof (x) == sizeof (double) \ 247 ? __isnan (x) : __isnanl (x)) 248 # endif 249 250 /* Return nonzero value if X is positive or negative infinity. */ 251 # ifdef __NO_LONG_DOUBLE_MATH 252 # define isinf(x) \ 253 (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x)) 254 # else 255 # define isinf(x) \ 256 (sizeof (x) == sizeof (float) \ 257 ? __isinff (x) \ 258 : sizeof (x) == sizeof (double) \ 259 ? __isinf (x) : __isinfl (x)) 260 # endif 261 262 /* Bitmasks for the math_errhandling macro. */ 263 # define MATH_ERRNO 1 /* errno set by math functions. */ 264 # define MATH_ERREXCEPT 2 /* Exceptions raised by math functions. */ 265 266 /* By default all functions support both errno and exception handling. 267 In gcc's fast math mode and if inline functions are defined this 268 might not be true. */ 269 # ifndef __FAST_MATH__ 270 # define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT) 271 # endif 272 273 #endif /* Use ISO C99. */ 274 275 #ifdef __USE_GNU 276 /* Return nonzero value if X is a signaling NaN. */ 277 # ifdef __NO_LONG_DOUBLE_MATH 278 # define issignaling(x) \ 279 (sizeof (x) == sizeof (float) ? __issignalingf (x) : __issignaling (x)) 280 # else 281 # define issignaling(x) \ 282 (sizeof (x) == sizeof (float) \ 283 ? __issignalingf (x) \ 284 : sizeof (x) == sizeof (double) \ 285 ? __issignaling (x) : __issignalingl (x)) 286 # endif 287 #endif /* Use GNU. */ 288 289 #ifdef __USE_MISC 290 /* Support for various different standard error handling behaviors. */ 291 typedef enum { 292 _IEEE_ = -1, /* According to IEEE 754/IEEE 854. */ 293 _SVID_, /* According to System V, release 4. */ 294 _XOPEN_, /* Nowadays also Unix98. */ 295 _POSIX_, 296 _ISOC_ /* Actually this is ISO C99. */ 297 } _LIB_VERSION_TYPE; 298 299 /* This variable can be changed at run-time to any of the values above to 300 affect floating point error handling behavior (it may also be necessary 301 to change the hardware FPU exception settings). */ 302 extern _LIB_VERSION_TYPE _LIB_VERSION; 303 #endif 304 305 #ifdef __USE_MISC 306 /* In SVID error handling, `matherr' is called with this description 307 of the exceptional condition. 308 309 We have a problem when using C++ since `exception' is a reserved 310 name in C++. */ 311 # ifdef __cplusplus 312 struct __exception 313 # else 314 struct exception 315 # endif 316 { 317 int type; 318 char *name; 319 double arg1; 320 double arg2; 321 double retval; 322 }; 323 324 # ifdef __cplusplus 325 extern int matherr(struct __exception *__exc) throw(); 326 # else 327 extern int matherr(struct exception *__exc); 328 # endif 329 330 # define X_TLOSS 1.41484755040568800000e+16 331 332 /* Types of exceptions in the `type' field. */ 333 # define DOMAIN 1 334 # define SING 2 335 # define OVERFLOW 3 336 # define UNDERFLOW 4 337 # define TLOSS 5 338 # define PLOSS 6 339 340 /* SVID mode specifies returning this large value instead of infinity. */ 341 # define HUGE 3.40282347e+38F 342 343 #else /* !Misc. */ 344 345 # ifdef __USE_XOPEN 346 /* X/Open wants another strange constant. */ 347 # define MAXFLOAT 3.40282347e+38F 348 # endif 349 350 #endif /* Misc. */ 351 352 /* Some useful constants. */ 353 #if defined __USE_MISC || defined __USE_XOPEN 354 # define M_E 2.7182818284590452354 /* e */ 355 # define M_LOG2E 1.4426950408889634074 /* log_2 e */ 356 # define M_LOG10E 0.43429448190325182765 /* log_10 e */ 357 # define M_LN2 0.69314718055994530942 /* log_e 2 */ 358 # define M_LN10 2.30258509299404568402 /* log_e 10 */ 359 # define M_PI 3.14159265358979323846 /* pi */ 360 # define M_PI_2 1.57079632679489661923 /* pi/2 */ 361 # define M_PI_4 0.78539816339744830962 /* pi/4 */ 362 # define M_1_PI 0.31830988618379067154 /* 1/pi */ 363 # define M_2_PI 0.63661977236758134308 /* 2/pi */ 364 # define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ 365 # define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ 366 # define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ 367 #endif 368 369 /* The above constants are not adequate for computation using `long double's. 370 Therefore we provide as an extension constants with similar names as a 371 GNU extension. Provide enough digits for the 128-bit IEEE quad. */ 372 #ifdef __USE_GNU 373 # define M_El 2.718281828459045235360287471352662498L /* e */ 374 # define M_LOG2El 1.442695040888963407359924681001892137L /* log_2 e */ 375 # define M_LOG10El 0.434294481903251827651128918916605082L /* log_10 e */ 376 # define M_LN2l 0.693147180559945309417232121458176568L /* log_e 2 */ 377 # define M_LN10l 2.302585092994045684017991454684364208L /* log_e 10 */ 378 # define M_PIl 3.141592653589793238462643383279502884L /* pi */ 379 # define M_PI_2l 1.570796326794896619231321691639751442L /* pi/2 */ 380 # define M_PI_4l 0.785398163397448309615660845819875721L /* pi/4 */ 381 # define M_1_PIl 0.318309886183790671537767526745028724L /* 1/pi */ 382 # define M_2_PIl 0.636619772367581343075535053490057448L /* 2/pi */ 383 # define M_2_SQRTPIl 1.128379167095512573896158903121545172L /* 2/sqrt(pi) */ 384 # define M_SQRT2l 1.414213562373095048801688724209698079L /* sqrt(2) */ 385 # define M_SQRT1_2l 0.707106781186547524400844362104849039L /* 1/sqrt(2) */ 386 #endif 387 388 /* When compiling in strict ISO C compatible mode we must not use the 389 inline functions since they, among other things, do not set the 390 `errno' variable correctly. */ 391 #if defined __STRICT_ANSI__ && !defined __NO_MATH_INLINES 392 # define __NO_MATH_INLINES 1 393 #endif 394 395 #if defined __USE_ISOC99 && __GNUC_PREREQ(2,97) 396 /* ISO C99 defines some macros to compare number while taking care for 397 unordered numbers. Many FPUs provide special instructions to support 398 these operations. Generic support in GCC for these as builtins went 399 in before 3.0.0, but not all cpus added their patterns. We define 400 versions that use the builtins here, and <bits/mathinline.h> will 401 undef/redefine as appropriate for the specific GCC version in use. */ 402 # define isgreater(x, y) __builtin_isgreater(x, y) 403 # define isgreaterequal(x, y) __builtin_isgreaterequal(x, y) 404 # define isless(x, y) __builtin_isless(x, y) 405 # define islessequal(x, y) __builtin_islessequal(x, y) 406 # define islessgreater(x, y) __builtin_islessgreater(x, y) 407 # define isunordered(u, v) __builtin_isunordered(u, v) 408 #endif 409 410 /* Get machine-dependent inline versions (if there are any). */ 411 #ifdef __USE_EXTERN_INLINES 412 # include <bits/mathinline.h> 413 #endif 414 415 /* Define special entry points to use when the compiler got told to 416 only expect finite results. */ 417 #if defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0 418 # include <bits/math-finite.h> 419 #endif 420 421 #ifdef __USE_ISOC99 422 /* If we've still got undefined comparison macros, provide defaults. */ 423 424 /* Return nonzero value if X is greater than Y. */ 425 # ifndef isgreater 426 # define isgreater(x, y) \ 427 (__extension__ \ 428 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 429 !isunordered (__x, __y) && __x > __y; })) 430 # endif 431 432 /* Return nonzero value if X is greater than or equal to Y. */ 433 # ifndef isgreaterequal 434 # define isgreaterequal(x, y) \ 435 (__extension__ \ 436 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 437 !isunordered (__x, __y) && __x >= __y; })) 438 # endif 439 440 /* Return nonzero value if X is less than Y. */ 441 # ifndef isless 442 # define isless(x, y) \ 443 (__extension__ \ 444 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 445 !isunordered (__x, __y) && __x < __y; })) 446 # endif 447 448 /* Return nonzero value if X is less than or equal to Y. */ 449 # ifndef islessequal 450 # define islessequal(x, y) \ 451 (__extension__ \ 452 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 453 !isunordered (__x, __y) && __x <= __y; })) 454 # endif 455 456 /* Return nonzero value if either X is less than Y or Y is less than X. */ 457 # ifndef islessgreater 458 # define islessgreater(x, y) \ 459 (__extension__ \ 460 ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 461 !isunordered (__x, __y) && (__x < __y || __y < __x); })) 462 # endif 463 464 /* Return nonzero value if arguments are unordered. */ 465 # ifndef isunordered 466 # define isunordered(u, v) \ 467 (__extension__ \ 468 ({ __typeof__(u) __u = (u); __typeof__(v) __v = (v); \ 469 fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; })) 470 # endif 471 472 #endif 473 474 __END_DECLS 475 #endif /* math.h */