1 /* math.h -- Definitions for the math floating point package. */ 2 3 #ifndef _MATH_H_ 4 #define _MATH_H_ 5 6 #include <sys/reent.h> 7 #include <machine/ieeefp.h> 8 #include "_ansi.h" 9 10 _BEGIN_STD_C 11 12 union __dmath 13 { 14 __ULong i[2]; 15 double d; 16 }; 17 18 union __fmath 19 { 20 __ULong i[1]; 21 float f; 22 }; 23 24 union __ldmath 25 { 26 __ULong i[4]; 27 _LONG_DOUBLE ld; 28 }; 29 30 #if defined(__GNUC__) && \ 31 ( (__GNUC__ >= 4) || \ 32 ( (__GNUC__ >= 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 3) ) ) 33 34 /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values. */ 35 36 #ifndef HUGE_VAL 37 #define HUGE_VAL (__builtin_huge_val()) 38 #endif 39 40 #ifndef HUGE_VALF 41 #define HUGE_VALF (__builtin_huge_valf()) 42 #endif 43 44 #ifndef HUGE_VALL 45 #define HUGE_VALL (__builtin_huge_vall()) 46 #endif 47 48 #else /* !gcc >= 3.3 */ 49 50 /* No builtins. Use floating-point unions instead. Declare as an array 51 without bounds so no matter what small data support a port and/or 52 library has, the reference will be via the general method for accessing 53 globals. */ 54 55 #ifndef HUGE_VAL 56 extern __IMPORT const union __dmath __infinity[]; 57 #define HUGE_VAL (__infinity[0].d) 58 #endif 59 60 #ifndef HUGE_VALF 61 extern __IMPORT const union __fmath __infinityf[]; 62 #define HUGE_VALF (__infinityf[0].f) 63 #endif 64 65 #ifndef HUGE_VALL 66 extern __IMPORT const union __ldmath __infinityld[]; 67 #define HUGE_VALL (__infinityld[0].ld) 68 #endif 69 70 #endif /* !gcc >= 3.3 */ 71 72 /* Reentrant ANSI C functions. */ 73 74 #ifndef __math_68881 75 extern double atan _PARAMS((double)); 76 extern double cos _PARAMS((double)); 77 extern double sin _PARAMS((double)); 78 extern double tan _PARAMS((double)); 79 extern double tanh _PARAMS((double)); 80 extern double frexp _PARAMS((double, int *)); 81 extern double modf _PARAMS((double, double *)); 82 extern double ceil _PARAMS((double)); 83 extern double fabs _PARAMS((double)); 84 extern double floor _PARAMS((double)); 85 #endif /* ! defined (__math_68881) */ 86 87 /* Non reentrant ANSI C functions. */ 88 89 #ifndef _REENT_ONLY 90 #ifndef __math_6881 91 extern double acos _PARAMS((double)); 92 extern double asin _PARAMS((double)); 93 extern double atan2 _PARAMS((double, double)); 94 extern double cosh _PARAMS((double)); 95 extern double sinh _PARAMS((double)); 96 extern double exp _PARAMS((double)); 97 extern double ldexp _PARAMS((double, int)); 98 extern double log _PARAMS((double)); 99 extern double log10 _PARAMS((double)); 100 extern double pow _PARAMS((double, double)); 101 extern double sqrt _PARAMS((double)); 102 extern double fmod _PARAMS((double, double)); 103 #endif /* ! defined (__math_68881) */ 104 #endif /* ! defined (_REENT_ONLY) */ 105 106 #ifndef __STRICT_ANSI__ 107 108 /* ISO C99 types and macros. */ 109 110 #ifndef FLT_EVAL_METHOD 111 #define FLT_EVAL_METHOD 0 112 typedef float float_t; 113 typedef double double_t; 114 #endif /* FLT_EVAL_METHOD */ 115 116 #define FP_NAN 0 117 #define FP_INFINITE 1 118 #define FP_ZERO 2 119 #define FP_SUBNORMAL 3 120 #define FP_NORMAL 4 121 122 extern int __fpclassifyf (float x); 123 extern int __fpclassifyd (double x); 124 extern int __signbitf (float x); 125 extern int __signbitd (double x); 126 127 #define fpclassify(x) \ 128 (__extension__ ({__typeof__(x) __x = (x); \ 129 (sizeof (__x) == sizeof (float)) ? __fpclassifyf(__x) : __fpclassifyd(__x);})) 130 131 #define isfinite(y) \ 132 (__extension__ ({__typeof__(y) __y = (y); \ 133 fpclassify(__y) != FP_INFINITE && fpclassify(__y) != FP_NAN;})) 134 #define isnormal(z) \ 135 (__extension__ ({__typeof__(z) __z = (z); \ 136 fpclassify(__z) == FP_NORMAL;})) 137 #define signbit(x) \ 138 (__extension__ ({__typeof__(x) __x = (x); \ 139 (sizeof(__x) == sizeof(float)) ? __signbitf(__x) : __signbitd(__x);})) 140 141 #define isgreater(x,y) \ 142 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 143 !isunordered(__x,__y) && (__x > __y);})) 144 #define isgreaterequal(x,y) \ 145 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 146 !isunordered(__x,__y) && (__x >= __y);})) 147 #define isless(x,y) \ 148 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 149 !isunordered(__x,__y) && (__x < __y);})) 150 #define islessequal(x,y) \ 151 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 152 !isunordered(__x,__y) && (__x <= __y);})) 153 #define islessgreater(x,y) \ 154 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 155 !isunordered(__x,__y) && (__x < __y || __x > __y);})) 156 157 #define isunordered(a,b) \ 158 (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \ 159 fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;})) 160 161 /* Non ANSI double precision functions. */ 162 163 extern double infinity _PARAMS((void)); 164 extern double nan _PARAMS((const char *)); 165 extern int isnan _PARAMS((double)); 166 extern int isinf _PARAMS((double)); 167 extern int finite _PARAMS((double)); 168 extern double copysign _PARAMS((double, double)); 169 extern int ilogb _PARAMS((double)); 170 171 extern double asinh _PARAMS((double)); 172 extern double cbrt _PARAMS((double)); 173 extern double nextafter _PARAMS((double, double)); 174 extern double rint _PARAMS((double)); 175 extern double scalbn _PARAMS((double, int)); 176 177 extern double exp2 _PARAMS((double)); 178 extern double scalbln _PARAMS((double, long int)); 179 extern double tgamma _PARAMS((double)); 180 extern double nearbyint _PARAMS((double)); 181 extern long int lrint _PARAMS((double)); 182 extern double round _PARAMS((double)); 183 extern long int lround _PARAMS((double)); 184 extern double trunc _PARAMS((double)); 185 extern double remquo _PARAMS((double, double, int *)); 186 extern double copysign _PARAMS((double, double)); 187 extern double fdim _PARAMS((double, double)); 188 extern double fmax _PARAMS((double, double)); 189 extern double fmin _PARAMS((double, double)); 190 extern double fma _PARAMS((double, double, double)); 191 extern void sincos _PARAMS((double, double *, double *)); 192 193 #ifndef __math_68881 194 extern double log1p _PARAMS((double)); 195 extern double expm1 _PARAMS((double)); 196 #endif /* ! defined (__math_68881) */ 197 198 #ifndef _REENT_ONLY 199 extern double acosh _PARAMS((double)); 200 extern double atanh _PARAMS((double)); 201 extern double remainder _PARAMS((double, double)); 202 extern double gamma _PARAMS((double)); 203 extern double gamma_r _PARAMS((double, int *)); 204 extern double lgamma _PARAMS((double)); 205 extern double lgamma_r _PARAMS((double, int *)); 206 extern double erf _PARAMS((double)); 207 extern double erfc _PARAMS((double)); 208 extern double y0 _PARAMS((double)); 209 extern double y1 _PARAMS((double)); 210 extern double yn _PARAMS((int, double)); 211 extern double j0 _PARAMS((double)); 212 extern double j1 _PARAMS((double)); 213 extern double jn _PARAMS((int, double)); 214 #define log2(x) (log (x) / M_LOG2_E) 215 216 #ifndef __math_68881 217 extern double hypot _PARAMS((double, double)); 218 #endif 219 220 extern double cabs(); 221 extern double drem _PARAMS((double, double)); 222 223 #endif /* ! defined (_REENT_ONLY) */ 224 225 #endif /* ! defined (__STRICT_ANSI__) */ 226 227 #if !defined(__STRICT_ANSI__) || defined(__cplusplus) 228 229 /* Single precision versions of ANSI functions. */ 230 231 extern float atanf _PARAMS((float)); 232 extern float cosf _PARAMS((float)); 233 extern float sinf _PARAMS((float)); 234 extern float tanf _PARAMS((float)); 235 extern float tanhf _PARAMS((float)); 236 extern float frexpf _PARAMS((float, int *)); 237 extern float modff _PARAMS((float, float *)); 238 extern float ceilf _PARAMS((float)); 239 extern float fabsf _PARAMS((float)); 240 extern float floorf _PARAMS((float)); 241 242 #ifndef _REENT_ONLY 243 extern float acosf _PARAMS((float)); 244 extern float asinf _PARAMS((float)); 245 extern float atan2f _PARAMS((float, float)); 246 extern float coshf _PARAMS((float)); 247 extern float sinhf _PARAMS((float)); 248 extern float expf _PARAMS((float)); 249 extern float ldexpf _PARAMS((float, int)); 250 extern float logf _PARAMS((float)); 251 extern float log10f _PARAMS((float)); 252 extern float powf _PARAMS((float, float)); 253 extern float sqrtf _PARAMS((float)); 254 extern float fmodf _PARAMS((float, float)); 255 #endif /* ! defined (_REENT_ONLY) */ 256 257 #endif /* !defined(__STRICT_ANSI__) || defined(__cplusplus) */ 258 259 #ifndef __STRICT_ANSI__ 260 261 /* Other single precision functions. */ 262 263 extern float exp2f _PARAMS((float)); 264 extern float scalblnf _PARAMS((float, long int)); 265 extern float tgammaf _PARAMS((float)); 266 extern float nearbyintf _PARAMS((float)); 267 extern long int lrintf _PARAMS((float)); 268 extern float roundf _PARAMS((float)); 269 extern long int lroundf _PARAMS((float)); 270 extern float truncf _PARAMS((float)); 271 extern float remquof _PARAMS((float, float, int *)); 272 extern float copysignf _PARAMS((float, float)); 273 extern float fdimf _PARAMS((float, float)); 274 extern float fmaxf _PARAMS((float, float)); 275 extern float fminf _PARAMS((float, float)); 276 extern float fmaf _PARAMS((float, float, float)); 277 278 extern float infinityf _PARAMS((void)); 279 extern float nanf _PARAMS((const char *)); 280 extern int isnanf _PARAMS((float)); 281 extern int isinff _PARAMS((float)); 282 extern int finitef _PARAMS((float)); 283 extern float copysignf _PARAMS((float, float)); 284 extern int ilogbf _PARAMS((float)); 285 286 extern float asinhf _PARAMS((float)); 287 extern float cbrtf _PARAMS((float)); 288 extern float nextafterf _PARAMS((float, float)); 289 extern float rintf _PARAMS((float)); 290 extern float scalbnf _PARAMS((float, int)); 291 extern float log1pf _PARAMS((float)); 292 extern float expm1f _PARAMS((float)); 293 extern void sincosf _PARAMS((float, float *, float *)); 294 295 #ifndef _REENT_ONLY 296 extern float acoshf _PARAMS((float)); 297 extern float atanhf _PARAMS((float)); 298 extern float remainderf _PARAMS((float, float)); 299 extern float gammaf _PARAMS((float)); 300 extern float gammaf_r _PARAMS((float, int *)); 301 extern float lgammaf _PARAMS((float)); 302 extern float lgammaf_r _PARAMS((float, int *)); 303 extern float erff _PARAMS((float)); 304 extern float erfcf _PARAMS((float)); 305 extern float y0f _PARAMS((float)); 306 extern float y1f _PARAMS((float)); 307 extern float ynf _PARAMS((int, float)); 308 extern float j0f _PARAMS((float)); 309 extern float j1f _PARAMS((float)); 310 extern float jnf _PARAMS((int, float)); 311 #define log2f(x) (logf (x) / (float) M_LOG2_E) 312 extern float hypotf _PARAMS((float, float)); 313 314 extern float cabsf(); 315 extern float dremf _PARAMS((float, float)); 316 317 #endif /* ! defined (_REENT_ONLY) */ 318 319 /* The gamma functions use a global variable, signgam. */ 320 #ifndef _REENT_ONLY 321 #define signgam (*__signgam()) 322 extern int *__signgam _PARAMS((void)); 323 #endif /* ! defined (_REENT_ONLY) */ 324 325 #define __signgam_r(ptr) _REENT_SIGNGAM(ptr) 326 327 /* The exception structure passed to the matherr routine. */ 328 329 #ifdef __cplusplus 330 struct __exception 331 #else 332 struct exception 333 #endif 334 { 335 int type; 336 char *name; 337 double arg1; 338 double arg2; 339 double retval; 340 int err; 341 }; 342 343 #ifdef __cplusplus 344 extern int matherr _PARAMS((struct __exception *e)); 345 #else 346 extern int matherr _PARAMS((struct exception *e)); 347 #endif 348 349 /* Values for the type field of struct exception. */ 350 351 #define DOMAIN 1 352 #define SING 2 353 #define OVERFLOW 3 354 #define UNDERFLOW 4 355 #define TLOSS 5 356 #define PLOSS 6 357 358 /* Useful constants. */ 359 360 #define MAXFLOAT 3.40282347e+38F 361 362 #define M_E 2.7182818284590452354 363 #define M_LOG2E 1.4426950408889634074 364 #define M_LOG10E 0.43429448190325182765 365 #define M_LN2 0.69314718055994530942 366 #define M_LN10 2.30258509299404568402 367 #define M_PI 3.14159265358979323846 368 #define M_TWOPI (M_PI * 2.0) 369 #define M_PI_2 1.57079632679489661923 370 #define M_PI_4 0.78539816339744830962 371 #define M_3PI_4 2.3561944901923448370E0 372 #define M_SQRTPI 1.77245385090551602792981 373 #define M_1_PI 0.31830988618379067154 374 #define M_2_PI 0.63661977236758134308 375 #define M_2_SQRTPI 1.12837916709551257390 376 #define M_SQRT2 1.41421356237309504880 377 #define M_SQRT1_2 0.70710678118654752440 378 #define M_LN2LO 1.9082149292705877000E-10 379 #define M_LN2HI 6.9314718036912381649E-1 380 #define M_SQRT3 1.73205080756887719000 381 #define M_IVLN10 0.43429448190325182765 /* 1 / log(10) */ 382 #define M_LOG2_E 0.693147180559945309417 383 #define M_INVLN2 1.4426950408889633870E0 /* 1 / log(2) */ 384 385 /* Global control over fdlibm error handling. */ 386 387 enum __fdlibm_version 388 { 389 __fdlibm_ieee = -1, 390 __fdlibm_svid, 391 __fdlibm_xopen, 392 __fdlibm_posix 393 }; 394 395 #define _LIB_VERSION_TYPE enum __fdlibm_version 396 #define _LIB_VERSION __fdlib_version 397 398 extern __IMPORT _CONST _LIB_VERSION_TYPE _LIB_VERSION; 399 400 #define _IEEE_ __fdlibm_ieee 401 #define _SVID_ __fdlibm_svid 402 #define _XOPEN_ __fdlibm_xopen 403 #define _POSIX_ __fdlibm_posix 404 405 #endif /* ! defined (__STRICT_ANSI__) */ 406 407 _END_STD_C 408 409 #ifdef __FAST_MATH__ 410 #include <machine/fastmath.h> 411 #endif 412 413 #endif /* _MATH_H_ */ 414